2012-03-20 1 views
2

У меня есть API-интерфейс Джерси, который возвращает стандартные ответы Odata и потребляет то же самое. Для этих ответов необходимы определенные пространства имен. У меня есть класс package-info.java:Джерси JAXB Marshalling устанавливает пространство имен по умолчанию для ns4, хотя 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 для автоматического маршала и распаковать входящее тело запроса и исходящий ответ для меня. У меня есть бобы, аннотированные для этих целей. Вот пример одного:

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

ответ

2

Примечание: Я - лидер 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; 

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

+0

Я видел Moxy как альтернатива в моих исследованиях для исправления. В этот момент я готов сделать это. Из моего исследования это больше не похоже на конфигурацию, за исключением файла свойств в пакете фасолей, которые я трансформирую. Похоже, мне придется поместить файл свойств в каждый пакет, у которого есть компоненты, которые я хочу преобразовать. Если есть способ поместить его в более родительский пакет. В любом случае, будет ли это работать, или мне нужно будет вручную загрузить его? ' com.sun.jersey.contribs Джерси-Moxy 1,12' – Elrond

+0

@ user1053116 - Вам нужно будет добавить файл jaxb.properties в по крайней мере один из пакетов, что 'JAXBContext' создается на. Если у вас есть какие-либо проблемы, дайте мне знать, и я помогу вам: http://blog.bdoughan.com/p/contact_01.html –

+0

На этом сайте нет формы. Я добавил MOXy - отлично работает. За исключением одного, и я не уверен в удаче. Единственное, что я добавил, это файл jaxb.properties. XML встречается без префикса пространства имен, но он включает двоеточие. Таким образом, вывод XML похож на этот '<: 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' - не уверен, как избавиться от двоеточия. – Elrond