2013-03-05 60 views
2

免责声明:我在这一切jaxbcontext.newinstance()与EclipseLink的莫西挂起

我试图让我的XML工作输出JSON除了项目令人难以置信的业余爱好者。 最初,这样做的方法涉及一种方法,它接受Element参数并递归插入net.sf JSONObject类型的对象以创建JSON输出,并使用正常的JAXBContextMarshaller编组为XML。

我想要的是将MOXy用作我的JAXB提供程序,然后从绑定中编组XML和JSON。

最初,XML被编组的时候,我有:

jc = JAXBContext.newInstance("packageA:packageB:packageC...etc."); 
public static String marshal(JAXBContext context, JAXBElement<?> je) throws JAXBException { 
    StringWriter sout = new StringWriter(); 
    Marshaller m = context.createMarshaller(); 
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE); 
    m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 
    m.marshal(je, sout); 
    return sout.toString(); 
} 

然后

(这可能是重要的,所以我应该提到的是应用我在使用弹簧框架。)

此外,我读过每一个关于EclipseLink的Blaise博客帖子。有几次。我只是它的一个非常粗浅的认识而会如果升值链接我到他的一个页面,你解释是它的任何解决方案,以及为什么它的工作原理

话虽这么说,我尝试了包括jaxb.properties文件其中一个试图获得MOXY的软件包,而不是JAXBElement来获得我的绑定。但是,JAXBContext.newInstance("my list of : delimited packages")只是使程序挂起。甚至没有错误,只是挂起它。单步显示调用EclipseLink newInstance方法挂起。 我在网上搜索了很多小时的解决方案。我有太多的类只包含在一个Class []中,所以不能通过使用一个类的数组来设置属性。这也是我无法使用本机moxy API而不是使用属性文件的原因。我认为我的EclipseLink设置正确:我在我的环境变量中设置了eclipselink_home,并将eclipselink.jar添加到了我的构建路径中。

+0

P.S.对于我差劲的大写字母和格式的追溯道歉。 – 2013-03-05 21:44:48

回答

1

更新#2

针对此问题的修复已经签入的EclipseLink 2.4.2和2.5.0流和包含修复每晚构建可从以下链接开始3月12日下载2013


更新#1

经过几次电子邮件交流,我认为你遇到的问题是由于以下错误。您可以使用该链接跟踪我们在这个问题上的进展情况。

我将演示如何表现如下:

的ObjectFactory

针对该问题的发生,你需要有一个@XmlElementDecl注释,其中name是与substitutionHeadName相同。

@XmlRegistry 
public class ObjectFactory { 

    @XmlElementDecl(name="foo", substitutionHeadName="foo") 
    public JAXBElement<Foo> createBar(Foo foo) { 
     return new JAXBElement<Foo>(new QName("foo"), Foo.class, foo); 
    } 

} 

域对象(美孚)

然后在您的域的一个对象,你需要有一个@XmlElementRef注释引用我们在@XmlElementDecl定义的元素。

public class Foo { 

    @XmlElementRef(name="foo") 
    public Foo foo; 

} 

演示

你会看到这个问题,当你创建JAXBContext

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class, ObjectFactory.class); 
     System.out.println(jc.getClass()); 
    } 

} 

痕量

MOXY得到无限循环将基准元件。

... 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.addReferencedElement(AnnotationsProcessor.java:3740) 
... 

原来的答案

你可以尝试使用下面创建您JAXBContext。它通过使用本地MOXY代码绕过标准的JAXB impl查找代码。

JAXBContext jc = org.eclipse.persistence.jaxb.JAXBContextFactory.createContext("packageA:packageB:packageC...etc."); 

如果有效,我们会知道问题与impl查找代码有关,我们可以从那里开始。

+0

我得到 类型JAXBContextFactory中的方法createContext(String,ClassLoader)不适用于参数(String) 我需要从某处获取类加载器吗?如果是这样的话(或者更确切地说,如果我传递了一堆软件包而不是一个类,我甚至会得到什么类加载器?) – 2013-03-05 21:39:06

+0

@MiloHou - 只需将'null'传递给'ClassLoader'即可。 – 2013-03-05 21:45:23

+0

好的。我不确定是否有必要。我应该删除其中一个包中的属性文件,还是不重要?尝试使用该代码行仍会使程序挂起(无论是否带有属性文件)。 请注意:JAXBContext jc应该是javax.bind.JAXBContext或org.eclipse类型的JAXBContext类型吗? P.S.建立上下文需要多长时间?在生成xml之前它只需要大约10秒钟之前,moxy jaxbcontext是否需要更长时间才能创建? P.P.S对不起墙 – 2013-03-05 21:51:20