Jersey JAXB Marshalling将默认命名空间设置为ns4,即使另外定义了package-info.java

时间:2012-03-20 21:35:55

标签: jaxb jersey jax-rs

我有一个Jersey API,它返回Odata标准响应并使用相同的消息。这些响应需要特定的名称空间。我有一个package-info.java类:

@XmlSchema(
xmlns = {
    @XmlNs(namespaceURI = "http://www.w3.org/2005/Atom", prefix = ""),
    @XmlNs(namespaceURI = "http://schemas.microsoft.com/ado/2007/08/dataservices", prefix = "d"),
    @XmlNs(namespaceURI = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata", prefix = "m")
},
namespace = "http://www.w3.org/2005/Atom",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
attributeFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED)
package my.package;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlSchema;

我使用JAXB为我自动编组和解组传入的请求正文和传出响应。我为这些目的注释了bean。以下是一个例子:

@XmlRootElement(name = "entry")
public class Entry
{
private String id;
private String title;
private Date updated;
private AtomLink link;
private Content content;

public Entry()
{
}

public Entry(final Content content)
{
this.content = content;
}

public Entry(final String id, final String title, final Date updated, final AtomLink link, final Content content)
{
this.id = id;
this.title = title;
this.updated = updated;
this.link = link;
this.content = content;
}

@XmlElement(name = "title")
public String getTitle()
{
return title;
}

public void setTitle(final String title)
{
this.title = title;
}

@XmlElement(name = "link")
public AtomLink getLink()
{
return link;
}

public void setLink(final AtomLink link)
{
this.link = link;
}

@XmlElement(name = "id")
public String getId()
{
return id;
}

public void setId(final String id)
{
this.id = id;
}

@XmlElement(name = "updated")
public Date getUpdated()
{
return updated;
}

public void setUpdated(final Date updated)
{
this.updated = updated;
}

@XmlElement(name = "content")
public Content getContent()
{
return content;
}

public void setContent(final Content content)
{
this.content = content;
}
}

响应就像这样。

<ns4:entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns:ns4="http://www.w3.org/2005/Atom">
<ns4:id>TEwxaTFL</ns4:id>
<ns4:title>my resource</ns4:title>
<ns4:link href="http://127.0.0.1:8080/API/resource(TEwxaTFL)" rel="self"/>
<ns4:content type="application/xml"> 
    <m:properties>
        <d:name>temp_170_ruleset</d:name>
        <d:shared>false</d:shared>
        <d:autorun>false</d:autorun>
    </m:properties>
</ns4:content>
</ns4:entry>

正如您所看到的,其他命名空间也很好。默认名称空间以ns4前缀而不是前缀返回。我需要它像这样:

    <entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns="http://www.w3.org/2005/Atom">
<id>TEwxaTFL</id>
<title>my resource</title>
<link href="http://127.0.0.1:8080/API/resource(TEwxaTFL)" rel="self"/>
<content type="application/xml"> 
    <m:properties>
        <d:name>temp_170_ruleset</d:name>
        <d:shared>false</d:shared>
        <d:autorun>false</d:autorun>
    </m:properties>
</content>
</entry>

我已经尝试修改package-info.java类来删除名称空格: 除去

@XmlNs(namespaceURI = "http://www.w3.org/2005/Atom", prefix = ""),

namespace = "http://www.w3.org/2005/Atom", 

一次删除一个。执行这些操作永远不会修复命名空间前缀,但会影响帖子的发生 - 无法进行映射。

谁能看到我在这里缺少的东西?我真的不想“手动”编组每一个回复。所以我想避免使用NamespacePrefixMapper解决方案,除非我可以在不手动编组响应的情况下定义它。我已经读过这个假设工作的地方了。

我使用Jersey 1.12,JAXB 2.2

- Outcome-- 使用Moxy工作。我正在努力让它发挥作用,因为使用的进口仍然是不适合我的JaxB。在语法上使用Moxy是一样的,所以没有为我们更新代码的开销。我们只需要添加jaxb.properties文件并更新我们的导入。我们摆脱这样的默认命名空间(ns1,ns4等)的唯一另一种方法是在出路时使用XSL - 这很糟糕。

1 个答案:

答案 0 :(得分:3)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。

<强>包信息

使用以下package-info和MOXy作为JAXB提供程序,我能够生成您正在寻找的XML。在我们完成以下错误的修复之前,必须注释掉的行:http://bugs.eclipse.org/365457

@XmlSchema(
xmlns = {
    //@XmlNs(namespaceURI = "http://www.w3.org/2005/Atom", prefix = ""),
    @XmlNs(namespaceURI = "http://schemas.microsoft.com/ado/2007/08/dataservices", prefix = "d"),
    @XmlNs(namespaceURI = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata", prefix = "m")
},
namespace = "http://www.w3.org/2005/Atom",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
attributeFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED)
package forum9795350;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlSchema;

了解更多信息