Apache CXF 生成数字而非字符串

3
如果一个字符串看起来像一个数字,例如 111, CXF 会返回它作为数字而不是字符串。
<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
    <property name="serializeAsArray" value="true" />
    <property name="arrayKeys" ref="jsonKeys" />
</bean>

如您所见,我使用JSON提供程序。我该如何强制其提供正确的JSON字符串?

{object:{"name":"111"}} instead of {object:{"name":111}}

Thanks in advance...

2个回答

6
您可以将SimpleConverter添加到JSONProvider中,这样它就不会将字符串转换为数字。默认情况下,它使用DefaultConverter。但是请确保相关的bean的类型为字符串类型。
<bean id="simpleConverter" class="org.codehaus.jettison.mapped.SimpleConverter"/>

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
    <property name="typeConverter" ref="simpleConverter"/>
</bean>

您可以在Jettison的以下链接中找到更多关于此缺陷的信息: http://jira.codehaus.org/browse/JETTISON-61 http://jira.codehaus.org/browse/JETTISON-36


4

编辑: 这似乎是Jettison的一个漏洞。org.apache.cxf.jaxrs.provider.json.JSONProvider使用了Jettison,导致了这个问题。如果你使用Jackson提供程序,那么这个问题就不存在了。

在jaxrs:server下的beans.xml中添加以下内容。

     <jaxrs:providers>
                <ref bean="jacksonProvider" />
        </jaxrs:providers>

.

而且,以下直接作为根的子元素。

<bean id="jacksonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider">

</bean>

根据JSON规范,数字可以作为值。其中的一段摘录如下:

2.1. Values

A JSON value MUST be an object, array, number, or string, or one of the following three literal names:

  false null true

这是规范中提到的一个示例。

   {
      "Image": {
          "Width":  800,
          "Height": 600,
          "Title":  "View from 15th Floor",
          "Thumbnail": {
              "Url":    "http://www.example.com/image/481989943",
              "Height": 125,
              "Width":  "100"
          },
          "IDs": [116, 943, 234, 38793]
        }
   }

如果您确实需要一个字符串,那么您可能需要查看资源类和相关的bean类,以确保字段类型正确!

正如我在问题中提到的那样,在Java中,我所谈论的所有对象属性都是字符串!因此,我不希望CXF返回一个数字作为字符串,而是期望它返回一个字符串作为字符串。但事实上它返回的是字符串"111"作为数字111。 - Nabor
返回类型在端点处全局设置。它可以正常工作,返回JSON,但是它将字符串创建为数字 ;)。使用Response并不会改变任何东西,在我的项目中已经这样了...看起来像是CXF的一个错误... - Nabor
@user1177897 我已经更新了答案并提供了一个可能的替代方案。解决方案是使用Jackson而不是Jettison进行JSON编组/解组。我认为这个错误应该报告给Jettison。 - Kasun Gajasinghe
我已经尝试过Jackson,但它生成了不同的JSON。问题在于,客户端当前依赖于JSON布局。Jackson默认情况下不会创建{"object":{"property":"value"}},而是创建{"property":"value"}。我希望可以进行配置,但在当前项目阶段,我不想更改主要组件。 - Nabor
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接