Jersey JAXB Marshalling устанавливает пространство имен по умолчанию в ns4, даже если package-info.java определен иначе - PullRequest
2 голосов
/ 21 марта 2012

У меня есть 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 на выходе - и это отстой.

1 Ответ

3 голосов
/ 21 марта 2012

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222) экспертная группа.

package-info

Используя следующее 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;

Для получения дополнительной информации

...