【问题标题】:CXF/JAXB fails at marshalling primitive long return valueCXF/JAXB 在编组原始长返回值时失败
【发布时间】:2014-07-23 08:31:41
【问题描述】:

我有一个简单的 CXF 方法,它返回一个 long

  @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:无法编组类型 “java.lang.Long”作为一个元素,因为它缺少一个 @XmlRootElement 注解

为什么 CXF 不能编组 long ? 感谢您的帮助

编辑

我实际上正在编写现有服务的模型实现(用于测试目的)。 我无法控制现有服务的 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。 但目前的客户也没有抱怨,也没有任何魔法。

【问题讨论】:

  • 您对输出的期望是什么?您的回复内容类型是什么?
  • 问题是因为你试图从一个长的,没有任何结构的xml,所以如果你愿意,用长的内部制作一个对象,并为jaxb添加必要的注释
  • 请看我上面的编辑
  • 好吧,如果您在 cxf 文档中看到他们总是使用 Reponse 或一些 jaxb 对象作为答案,就像我说您正在尝试将 Long 转换为没有任何结构的 xml,jaxb 不知道 wwitch element root put在 xml 输出中,响应必须是 22?那为什么不工作。

标签: java spring jaxb cxf


【解决方案1】:

为什么需要为单个返回值创建 xml 结构,您将其作为文本重新运行并添加返回类型内容为纯/文本的 Annotation Produces。

@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;

    }

【讨论】:

  • 在“编辑”中,我说我使用的是我无法控制的 API。
  • @RaphaelJolivet 添加了编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2019-10-20
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多