【问题标题】:jaxbcontext.newinstance() with eclipselink MOXy hangs带有 eclipselink MOXy 的 jaxbcontext.newinstance() 挂起
【发布时间】:2013-03-05 21:26:21
【问题描述】:

免责声明:我非常业余

我正在尝试让我正在处理的项目除了 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();
}

然后

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") 只会让程序挂起。甚至没有错误,只是挂起它。单步执行只是显示了对 EclipseLink newInstance 方法的调用挂起。 我已经在网上寻找了很多小时的解决方案。我有太多的类只能包含在 Class[] 中,因此无法通过使用类数组来设置属性。这也是我不能使用本机 moxy API 而不是使用属性文件的原因。我认为我已经正确设置了 EclipseLink:我在我的环境变量中设置了 eclipselink_home,并将 eclipselink.jar 添加到我的构建路径中。

【问题讨论】:

  • P.S.为我糟糕的大写和格式道歉。

标签: json spring eclipselink moxy


【解决方案1】:

更新 #2

已在 EclipseLink 2.4.2 和 2.5.0 流中签入此问题的修复程序,并且可以从 2013 年 3 月 12 日开始从以下链接下载包含该修复程序的夜间构建:


更新 #1

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

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

对象工厂

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

【讨论】:

  • 我得到 JAXBContextFactory 类型中的方法 createContext(String, ClassLoader) 不适用于参数 (String) 我需要从某个地方获取类加载器吗?如果是这样的话(或者更确切地说,如果我传递的是一堆包而不是一个类,我什至会得到什么类加载器?)
  • @MiloHou - 只需将null 传递给ClassLoader
  • 嗯,好的。我不确定是否有必要。我应该删除我在其中一个包中的属性文件,还是没关系?尝试该行代码仍然会使程序挂起(无论有无属性文件)。附带说明:JAXBContext jc 的类型应该是 javax.bind.JAXBContext 还是 org.eclipse...JAXBContext?附言创建上下文需要多长时间?在生成 xml 之前只需要大约 10 秒之前,moxy jaxbcontext 是否需要更长的时间来创建? P.P.S 对不起文字墙
  • @MiloHou - 你试过在 Spring 环境之外创建它吗?
  • 创建相同的上下文或使用 eclipselink 创建任何上下文?我不确定如何在 Spring 之外创建上下文。据我所知,Spring 只允许我注入依赖项,我现在只是将它作为 Junit 测试运行。虽然老实说,我的回答与您实际询问的内容之间可能存在巨大的理解差距;我对Spring的理解也有点浅
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2012-01-14
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多