当前位置: 首页 > 知识库问答 >
问题:

CXF/JAXB在编组原语长返回值时失败

范凡
2023-03-14

我有一个简单的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。太阳伊斯塔克。SAXException2:无法将类型“java.lang.Long”封送为元素,因为它缺少@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。但是当前客户端也没有抱怨,也没有包含任何魔力。

共有1个答案

常经赋
2023-03-14

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

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

    }
 类似资料:
  • 您好,我是Jaxb新手,已经花了3个多小时搜索这个NullPointerException和这个解编组的东西,但没有找到适合我的东西。我尝试了inputStream、StringReader和Buffered reader,但当我试图将XML文件解压缩到java对象时,所有这些都导致了空值,下面是一个例外: 这是XML文件:

  • 当在testng单元testcase中运行时,JAXB将XML文件解组到对象中工作正常。 当相同的代码被用来在另一个进程中解封相同的XML文件时,我得到了一个空对象。我可以验证对象是为XML文档中的每个元素创建的,并且所有适配器都被调用。在unmarshaller中设置事件处理程序,但没有验证问题。当我设置xmlns属性和前缀时,即使返回空对象,行为也略有不同。 我看了好几篇文章,但都无法与我面临

  • 我正在创建一个Spring Boot应用程序来替换一个遗留的api应用程序,所以所有的路由/header/etc都已经固定下来了。在那个遗留应用程序中,我们使用自定义Accept头来包含版本和内容类型。因此,我们的Accept标头如下所示: xml或catalog.v2.json等。 下面是处理请求的方法的请求映射。我现在正在尝试处理v1.xml。Spring找到了正确的方法,整个方法被执行并返回

  • 问题内容: 我在两个不同的Java项目中有两个代码,几乎可以完成相同的工作(根据xsd文件解组Web服务的输入)。 但是在一种情况下,我应该这样写:(输入是一个占位符名称)(元素是OMElement输入) 在另一个库中,我必须使用JAXBElement.getValue(),因为它是返回的JAXBElement,并且简单的(Input)强制转换会崩溃: 您知道导致这种差异的原因吗? 问题答案: 如

  • 问题内容: 我正在尝试与JAXB进行封送处理。 我的输出就像 但是我需要像这样的输出 我正在使用以下代码来执行此操作。如果我取消注释代码,则会出现属性绑定异常。没有它,我可以编译,但无法获得所需的确切输出。 和我的豆lo 转接器类别 问题答案: 您可以执行以下操作: 适配器CDATA 根 该注释用于指定的应该被使用。 演示版 我必须包装一个以获得所需的效果。另请注意,设置方法意味着它负责该操作的所

  • 本文向大家介绍Objective-C语言返回值,包括了Objective-C语言返回值的使用技巧和注意事项,需要的朋友参考一下 示例 当要从方法返回值时,请将要返回的类型放在第一组括号中。 您要返回的值放在return关键字之后;