Jaxb jax-rs响应实体不是xmlroot,而是一个元素

Jaxb jax-rs响应实体不是xmlroot,而是一个元素,jaxb,jax-rs,Jaxb,Jax Rs,我有一个JAX-RS响应方法 @产生('application/xml','application/json') 我还有一个JAX-B实体,它生成以下内容: 乔 123家 对于此呼叫/person/Joe 我想用/person/joe/address 返回 <address> <street>123 home</street> </address> 123家 使用JAX-RS/Jersey,我得到一个错误: mim

我有一个JAX-RS响应方法

@产生('application/xml','application/json')
我还有一个JAX-B实体,它生成以下内容:


乔
123家
对于此呼叫
/person/Joe

我想用
/person/joe/address

返回

  <address>
       <street>123 home</street>
  </address>

123家
使用JAX-RS/Jersey,我得到一个错误:

mime类型为application/XML时,类型Address.class没有封送拆收器


发生这种情况是因为address对象没有被注释为
@XMLRootElement

您可以使用
@XMLRootElement
注释
address
类,或者将其包装在
JAXBElement
的实例中

newjaxbelement(
新QName(“地址”),
Address.class,
地址);

我已经编写了一个简单的提供程序来处理这个场景,它似乎和我预期的一样工作。它将把xmlType包装在一个jaxbelement中,以便对其进行封送处理

/**
*默认情况下,我们无法将{@link XmlType}对象编写为必须的xml
*基于{@link XmlRootElement}的对象,此类将包装{@link XmlType}
*用{@link JAXBElement}和马歇尔
* 
*@作者肖恩
* 
*/
@提供者
@使用({“application/xml”、“text/xml”})
公共类XMLTypeWriter扩展AbstractRootElementProvider{
私有静态最终记录器Logger=LoggerFactory.getLogger(XMLTypeWriter.class);
公共XMLTypeWriter(@Context-Providers-ps){
超级(ps、MediaType.APPLICATION\uXML\uType);
}
@凌驾
受保护的布尔值isSupported(MediaType m){
返回(m.equals(MediaType.APPLICATION|XML|TYPE)| m.equals(MediaType.TEXT|XML|TYPE));
}
@凌驾
公共布尔值可读取(类类型、类型genericType、注释[]注释、MediaType MediaType){
//已经定义了一个xmltype读取器。
返回false;
}
@凌驾
公共布尔值可写(类类型、类型genericType、注释[]注释、MediaType MediaType){
返回类型.isAnnotationPresent(XmlType.class)和&isSupported(mediaType);
}
@凌驾
受保护的void writeTo(对象t、MediaType、MediaType、字符集c、封送器m、OutputStream entityStream)抛出JAXBEException{
//需要从注释中获取类型名称
XmlType xt=t.getClass().getAnnotation(XmlType.class);
JAXBElement p=null;
如果(xt!=null){
String name=xt.name();
p=新的JAXBElement(QName.valueOf(name),t.getClass(),t);
}
super.writeTo(p,mediaType,c,m,entityStream);
}
}

这些类是从xsd生成的,因此我无法将XmlRootElement注释放在地址上。我也尝试过用JAXBElement包装这个类,正如你提到的,但是这会破坏json响应,它会将JAXBElement打包成json元素