2015-08-17 3 views
0

классов JAXB (при условии, что я не могу изменить их),Нужна помощь по использованию Джерси 2,17 и Moxy для обработки XML любой коллекции

FindResponse.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 

}) 
@XmlRootElement(name = "findResponse") 
public class FindResponse { 

    @XmlElement(required = true) 
    protected ListWrapper result; 

    public ListWrapper getResult() { 
     return result; 
    } 

    public void setResult(ListWrapper value) { 
     this.result = value; 
    } 

} 

ListWrapper.java

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "List", propOrder = { 
    "any" 
}) 
public class ListWrapper { 

    @XmlAnyElement(lax = true) 
    protected java.util.List<Object> any; 

    public java.util.List<Object> getAny() { 
     if (any == null) { 
      any = new ArrayList<Object>(); 
     } 
     return this.any; 
    } 
} 

Ни один из классов Jaxb, завернутый в класс ListWrapper, имеет аннотацию @XmlRoolElement (созданную из классов .xsd, хотя и 2000+).

LagInterface.class

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "lag.Interface") 
public class LagInterface extends AggregationPortAggregationGroup { 

    private String objectFullName; 
    private String displayedName; 
    private String description; 
    private Integer lagId; 

    ... 
} 

Json метод ресурсов

@GET 
@Path("json/{samoXmlType}") 
@Produces(MediaType.APPLICATION_JSON) 
public Response jsonGetService(
     @PathParam("samoXmlType") String samoXmlType, 
     @Context HttpServletRequest request, 
     @Context HttpServletResponse response) 
     throws Exception 
{ 
    LagInterface lag = new LagInterface(); 
    lag.setObjectFullName("lag-interface:1"); 
    lag.setDisplayedName("lag 1"); 
    lag.setDescription("moxy test"); 
    lag.setLagId(1); 

    FindResponse findResponse = new FindResponse(); 
    ListWrapper result = new ListWrapper(); 
    result.getAny().addAll(Arrays.asList(lag)); 
    findResponse.setResult(result); 

    return Response.ok(findResponse).build(); 
} 

Ответ от описанного выше способа:

{"result":{}} 

Подобный ответ XML:

<?xml version="1.0" encoding="UTF-8"?> 
<ns0:findResponse xmlns:ns0="xmlapi_1.0"><ns0:result/></ns0:findResponse> 

Это предупреждение связано с XML Любая коллекция:

[EL Warning]: XMLAnyCollectionMappingNodeValue: The undefined document root element of a referenced object [XMLDescriptor(LagInterface --> [])] is ignored during marshalling with an any collection|object mapping. 

ответ

0

Хорошо, я получаю это работает с помощью файла ОХМ метаданных, чтобы добавить недостающую @XmlRootElement на LagInterface. Но производительность настолько плоха, что требуется минута, чтобы получить контент xml или json.

И теперь у меня есть другая проблема, в файле метаданных oxm, я должен указать имя пакета. Это означает, что мне придется создавать довольно некоторые файлы oxm для моих классов модели JAXB.

Есть ли способ, которым я могу иметь один файл medata для всех моих классов моделей?