2013-02-12 83 views
2

我正在使用MOXy和属于不同名称空间的类,但MOXY总是将错误的名称空间添加到引用的对象中。为什么这个简单的例子不能按预期工作?JAXB/MOXy:错误的元素名称空间

AtomLink.java:

package org.atom; 

@XmlAccessorType(XmlAccessType.NONE) 
public class AtomLink { 

    @XmlAttribute 
    protected String rel; 
    @XmlAttribute(required = true) 
    @XmlSchemaType(name = "anyURI") 
    protected String href; 

    public AtomLink() { 
    } 

    public AtomLink(String rel, String href) { 
     this.rel = rel; 
     this.href = href; 
    } 

} 

Person.java

package org.example; 

import org.atom.AtomLink; 

@XmlRootElement(name = "person") 
@XmlAccessorType(XmlAccessType.NONE) 
public class Person { 

    @XmlElement 
    protected String name; 
    @XmlElement 
    protected AtomLink link; 

    public Person() { 
    } 

    public Person(String name, AtomLink link) { 
     this.name = name; 
     this.link = link; 
    } 

} 

package-info.java

@XmlSchema(namespace = "http://www.w3.org/2005/Atom", xmlns={ 
    @XmlNs(namespaceURI = "http://www.w3.org/2005/Atom", prefix = "atom")}, elementFormDefault = XmlNsForm.QUALIFIED, attributeFormDefault = XmlNsForm.QUALIFIED) 
package org.atom; 

package-info.java

@XmlSchema(namespace = "http://www.test.org", xmlns={ 
    @XmlNs(namespaceURI = "http://www.test.org", prefix = "test")}, elementFormDefault = XmlNsForm.QUALIFIED, attributeFormDefault = XmlNsForm.UNQUALIFIED) 
package org.example; 

测试码:

Person person = new Person("Test", new AtomLink("self", "http://www.test.org/person/Test")); 
try { 
    JAXBContext context = JAXBContextFactory.createContext(new Class[] { Person.class }, null); 
    Marshaller marshaller = context.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(person, System.out); 
} catch (JAXBException e) { 
    e.printStackTrace(); 
} 

结果:

<?xml version="1.0" encoding="UTF-8"?> 
<test:person xmlns:atom="http://www.w3.org/2005/Atom" xmlns:test="http://www.test.org"> 
    <test:name>Test</test:name> 
    <test:link atom:rel="self" atom:href="http://www.test.org/person/Test"/> 
</test:person> 

但我期待:

... 
    <atom:link atom:rel="self" atom:href="http://www.test.org/person/Test"/> 
... 

为什么MOXy没有意识到类AtomLink属于不同的名称空间?正如你所看到的,只有元素的名字空间是错误的,但是它的属性被分配给了正确的名字空间。

更新

我按照提议完成了以下更改。类如下所示:

AtomLink.java

@XmlRootElement(name = "link") 
@XmlAccessorType(XmlAccessType.NONE) 
public class AtomLink { 

    @XmlAttribute 
    protected String rel; 
    @XmlAttribute(required = true) 
    @XmlSchemaType(name = "anyURI") 
    protected String href; 

    public AtomLink() { 
    } 

} 

Person.java:

@XmlRootElement(name = "person") 
@XmlAccessorType(XmlAccessType.NONE) 
public class Person { 

    @XmlElement 
    private String name; 
    @XmlElementRef 
    private AtomLink link; 

    public Person() { 
    } 

    public Person(String name, AtomLink link) { 
     this.name = name; 
     this.link = link; 
    } 

} 

结果是无效的XML文件,其中N0为的targetNamespace用于限定链接元素,但其属性分配给我的atom-prefix。

<?xml version="1.0" encoding="UTF-8"?> 
<test:person xmlns:test="http://www.test.org" xmlns:ns0="http://www.w3.org/2005/Atom> 
    <test:name>Test</test:name> 
    <ns0:link atom:rel="self" atom:href="http://www.test.org/person/Test"/> 
</test:person> 

扩展用原子条目的“http://www.test.org”命名空间是不是一个解决方案,因为,在一个命名空间声明总是导致即使没有原子的元素存在XML文档英寸

UPDATE2

如果我使用Java内部JAXB,实现万物按预期工作......必须有在莫西执行错误。

+0

是的,我相信你遇到了一个MOXY错误,所以我报告了它:https://bugs.eclipse.org/bugs/show_bug.cgi?id=400545 – 2013-02-12 10:11:29

+0

@MichałPolitowski - 感谢您输入错误,我们应该能够很快得到解决。 – 2013-02-12 10:23:30

+1

非常感谢您的支持。此修补程序对我目前的项目非常有用。 – 2013-02-12 10:48:15

回答

1

您遇到的情况是MOXy中的bug现已在EclipseLink 2.4.2和2.5.0流中修复。您可以从以下位置每晚构建为2月13日的2013年

在正确的映射方面看answer given by Michał Politowski

+1

非常感谢!我已经下载并测试了您的新版本(org.eclipse.persistence.moxy_2.5.0.v20130213-32655ee.jar)。该错误已解决,一切按预期工作。优秀作品! – 2013-02-13 08:47:08

1

这是JAXB的工作方式。本地元素的命名空间(就像它的名字一样,非常自然)由它的@XmlElement注释的属性指定。

如果你想AtomLink,不Person,来决定这些(包括名称空间和名称,因为他们走在一起),你必须使它@XmlRootElement和个人使用@XmlElementRef

如果你想留在@XmlElement

@XmlElement(namespace="http://www.w3.org/2005/Atom") 
private AtomLink link; 

是要走的路。

相关问题