带有eclipselink的jaxbcontext.newinstance()MOXy挂起

时间:2013-03-05 21:26:21

标签: json spring eclipselink moxy

免责声明:我对这一切都非常业余

我正在尝试获取我正在努力输出JSON以及XML的项目。 最初执行此操作的方法涉及一种方法,该方法接受Element的参数并递归地将事物插入到net.sf JSONObject类型的对象中以创建JSON输出,并使用普通JAXBContext的{​​{1编组成XML。

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

最初,当XML被编组时,我有:

Marshaller
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();
}

(这可能很重要,所以我应该提一下我正在使用的应用程序使用spring框架。)

另外,我已经阅读了Blaise关于EclipseLink的每一篇博文。有的多次。我只是对它有一个非常浅薄的理解,并希望如果不是将我链接到他的一个页面,你解释了它的任何解决方案及其工作原理

话虽这么说,我尝试在其中一个软件包中包含JAXBElement<myObject> jaxb = new JAXBElement<myObject>(myObject_QNAME, myObject.class, null, value); return XmlResponseMessage(marshal(jc, jaxb)); } 文件以尝试获取MOXy而不是jaxb.properties来获取我的绑定。 但是,JAXBElement只会让程序挂起。甚至没有错误,只是挂起它。单步调试只显示对EclipseLink JAXBContext.newInstance("my list of : delimited packages")方法的调用。 我在线寻找解决方案的时间很长。我有太多的类只能包含在Class []中,因此不能通过使用类数组来设置属性。这也是我无法使用本机moxy API而不是使用属性文件的原因。我认为我正确设置了EclipseLink:我在我的环境变量中设置了newInstance,并将eclipselink.jar添加到了我的构建路径中。

1 个答案:

答案 0 :(得分:1)

更新#2

此问题的修复程序已经检入EclipseLink 2.4.2和2.5.0流,并且可以从以下链接下载包含修复程序的每晚构建 2013年3月12日:< / p>


更新#1

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

我将在下面展示它如何表现出来:

<强>的ObjectFactory

要解决问题,您需要@XmlElementDecl注释,其中namesubstitutionHeadName相同。

@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);
    }

}

域对象(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查找代码有关,我们可以从那里开始。