2

免责声明:我非常业余

我正在尝试让我正在处理的项目除了 XML 之外还输出 JSON。最初,这样做的方法涉及一个方法,该方法接受 Element 的参数并将事物递归地插入到 net.sf JSONObject 类型的对象中以创建 JSON 输出,并使用普通JAXBContext的 'sMarshaller编组为 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();
}

进而

JAXBElement<myObject> jaxb = 
  new JAXBElement<myObject>(myObject_QNAME, myObject.class, null, value);
return XmlResponseMessage(marshal(jc, jaxb));
}

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

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

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

4

1 回答 1

1

更新#2

EclipseLink 2.4.2 和 2.5.0 流中已对该问题进行了修复,并且可以从2013 年 3 月 12 日开始从以下链接下载包含该修复的每晚构建:


更新#1

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

我将在下面演示它是如何表现出来的:

对象工厂

要发生问题,您需要有一个@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 查找代码有关,我们可以从那里着手。

于 2013-03-05T21:35:44.657 回答