我有一个简单的 CXF 方法,可以返回长
@GET
@Path("/count/{foo}/{bar}")
long count(@PathParam("foo") String foo, @PathParam("bar") String bar)
我有一个带有JAXB设置的CXF服务器
<jaxrs:server id="myServer" address="/">
<jaxrs:providers>
<bean id="jaxbProvider" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
<property name="singleJaxbContext" value="true" />
<property name="skipJaxbChecks" value="true" />
<property name="validateOutput" value="false" />
</bean>
</jaxrs:providers>
<jaxrs:serviceBeans>
<ref bean="myServiceImpl" />
</jaxrs:serviceBeans>
</jaxrs:server>
但是当我调用此方法时,服务器在编组结果时失败:
引起:com.sun.istack.SAXException2:无法编组类型 &#34; java.lang.Long中&#34;作为一个元素,因为它缺少一个 @XmlRootElement注释
为什么CXF无法整理长? 谢谢你的帮助
修改
我实际上正在编写现有服务的模型实现(用于测试目的)。 我无法控制现有服务的API。 它的当前实现返回类似
的内容Response-Code: 200
Encoding: ISO-8859-1
Content-Type: application/xml
Headers: {connection=[close], Content-Length=[3], content-type=[application/xml], Date=[Wed, 23 Jul 2014 08:00:31 GMT]}
Payload: 121
我同意哪个不是真正的XML。 但是现在的客户也没有抱怨,也没有任何魔力。
答案 0 :(得分:0)
为什么需要为单个返回值创建xml结构,将其作为文本重新运行,并将返回类型内容的Annotation Produces添加为plain / text。
@GET
@Produces("text/plain")
@Path("/count/{foo}/{bar}")
long count(@PathParam("foo") String foo, @PathParam("bar") String bar)
如果您使用的是cxf客户端,则可以按照以下步骤阅读
Response response = client.get();
response.readEntity(Long.class);
EDIT
删除jaxrs:providers,cxf默认在内部处理jaxb转换
<jaxrs:server id="myServer" address="/">
<jaxrs:serviceBeans>
<ref bean="myServiceImpl" />
</jaxrs:serviceBeans>
</jaxrs:server>
以下是我测试过的代码,但是当我添加提供程序时,它会给出错误。
@Path("/add")
@Produces("application/xml")
@GET
public Long add(@QueryParam("v1")int v1, @QueryParam("v2")int v2){
long result =v1+v2;
return result;
}
@Path("/subtract")
@Produces("application/xml")
@GET
public Output subtract(@QueryParam("v1")int v1, @QueryParam("v2")int v2){
Output out = new Output();
out.setResult(v1-v2);
return out;
}