У меня есть API Джерси, который возвращает стандартные ответы Odata и потребляет их. Для этих ответов необходимы определенные пространства имен. У меня есть пакет-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 для автоматического маршалинга и демаршализации тела входящего запроса и исходящего ответа для меня. У меня есть бобы для этих целей. Вот пример одного:
@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, если только я не могу определить это, не маршируя ответ вручную. Я читал, где это должно работать.
Я использую Джерси 1.12, JAXB 2.2
- Outcome--
Использование Moxy работает. Я боролся с тем, чтобы заставить его работать, потому что используемый импорт был все еще JaxB, который не работал для меня. Синтаксическое использование Moxy - то же самое, поэтому не было никаких накладных расходов на обновление кода для нас. Нам просто нужно было добавить файл jaxb.properties и обновить наш импорт. Единственный способ избавиться от пространства имен по умолчанию (ns1, ns4 и т. Д.) - это использовать XSL на выходе - и это отстой.