我正在尝试获取我正在努力输出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添加到了我的构建路径中。
答案 0 :(得分:1)
更新#2
此问题的修复程序已经检入EclipseLink 2.4.2和2.5.0流,并且可以从以下链接下载包含修复程序的每晚构建 2013年3月12日:< / p>
更新#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);
}
}
域对象(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查找代码有关,我们可以从那里开始。