我有一个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 - 这很糟糕。
答案 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;
了解更多信息