【问题标题】:Apache CXF generates Number instead of StringApache CXF 生成数字而不是字符串
【发布时间】:2012-06-05 10:51:49
【问题描述】:

如果一个字符串看起来像一个数字,例如。 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}}

提前谢谢...

【问题讨论】:

    标签: java cxf jax-rs


    【解决方案1】:

    您可以将 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

    【讨论】:

    • 这就是我要找的东西
    【解决方案2】:

    编辑: 这似乎是 Jettison 中的一个错误。 org.apache.cxf.jaxrs.provider.json.JSONProvider 使用了导致此问题的 Jettison。如果你使用Jackson provider,那么这个问题就不再存在了。

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

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

    .

    并且,以下直接作为root的子级。

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

    根据JSON Specification,数字可以作为值。它的摘录说,

    2.1。价值观

    JSON 值必须是对象、数组、数字或字符串,或其中之一 以下三个字面名称:

      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
    • 好吧,我猜是相关的 bean 类,并且资源配置为 haveStrings。当键 name 有整数时,您是否收到编组错误?问题中提供的响应是响应内容主体,对吧?
    • 你可以复制它。创建一个 Maven 项目。应使用以下 pom.xml:pastebin.com/01Y5QW3F。另外使用这个 beans.xml:pastebin.com/BkDu84qp。 web.xml pastebin.com/Q1zLSd3a 和 Java 文件:pastebin.com/xLCwENkf & pastebin.com/tgY3ZKZw。如果您随后启动服务器并调用localhost:8080/services,您将得到这个 JSON:{"attribute":{"firstname":"User","lastname":123}}。但正如您在 Java 代码中看到的,123 是一个字符串。
    • 我还没有时间对此进行测试,但您可以尝试使用返回类型作为 getTest 的响应。您当然可以在那里添加您的 bean 实例(测试)。类似return Response.ok().entity( new Test().setFirstname("User").setLastname("123") ).type(MediaType.APPLICATION_JSON).build()
    • 返回类型在端点全局设置。它工作正常,它返回 JSON,但它将字符串创建为 Number ;)。使用 Response 并没有改变任何东西,我的项目中已经采用了这种方式......它看起来像 CXF 中的一个 Bug......
    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 2016-03-25
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多