【问题标题】:Jackson JSON not working with CXF杰克逊 JSON 不适用于 CXF
【发布时间】:2013-01-18 13:41:53
【问题描述】:

JacksonJsonProvider 不适用于 CXF。

CXF v2.6.0 杰克逊 v2.1.2 (com.fasterxml.jackson) RESTClient(用于测试)

我确实在 beans.xml 中配置了如下所示的提供程序。

<bean id="jacksonMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
    <property name="dateFormat">
    <bean class="java.text.SimpleDateFormat">
    <constructor-arg type="java.lang.String" value="yyyy-MM-dd'T'HH:mm:ss.SSSZ">     </constructor-arg>
    </bean>
   </property>
</bean>

<bean id="jacksonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider">
    <property name="mapper" ref="jacksonMapper" />
</bean>

在 jaxrs:服务器中.....>

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

</jaxrs:server>

应用程序的部署没有任何问题,它提供了良好的 JSON,而我将请求作为“application/xml”并将响应作为“application/json”。

当我尝试通过设置 Content-Type=application/json 在请求中提供 JSON 时,我面临 500 内部服务器错误

请求正在通过 CXF-logging 记录在日志文件中。

请求根本没有登陆我的webservice的服务实现类。

请求正文中的 JSON 是:

{"SearchOrdersRequest":{"LoginCredentials":{"AppId":"BookStore","Username":"myuser","Password":"abcd1234","SecurityToken":"Vcvx45YilzX1"},"SearchHeader":{"SearchCategory":"Rep","FilterLogic":"1 AND 2","SearchParams":{"Field":"Order Number (s)","Operator":"EQUALS","Values":"600045335"}}}} 

感谢您提供任何即时帮助。

【问题讨论】:

  • 你得到这个问题的解决方案了吗?

标签: json cxf jackson


【解决方案1】:

CXF documentation 中,您可以看到需要添加 json 提供程序并包含依赖项的位置。但是,当我尝试添加杰克逊而不是抛弃时,我仍然遇到错误,几个小时后,我认为您需要再包含一个杰克逊依赖项。

  1. 添加 JSON 提供程序

    <jaxrs:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
    </jaxrs:providers>
    
  2. 添加依赖项

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-xc</artifactId>
        <version>1.9.12</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.12</version>
    </dependency>
    

【讨论】:

  • 这在 2 年后仍然有效
  • 如何用纯 javaconfig 替换 jaxrs:providers(没有 xml?)
【解决方案2】:

据我了解,您的应用程序会生成和使用 xml 和 json 格式。所以,首先。确保您的 cxf 资源端点能够执行此操作。

@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})

否则您的请求将找不到任何资源实现。 (在类级别或方法级别的这些行)

如果这还不够,请查看此 jackson cxf 集成:

<bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
<bean id="jsonContextResolver" class="net.sf.gazpachoquest.rest.support.JacksonContextResolver" />

还有

 <jaxrs:server id="services" address="/">
   <jaxrs:providers>
      <ref bean="jsonProvider" />
      <ref bean="jsonContextResolver" />
     </jaxrs:providers>
  </jaxrs:server>

定义映射器的类的上下文解析器:

@Provider
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {

    private final ObjectMapper mapper = new ObjectMapper();

    public JacksonContextResolver() {
        /*
         * Register JodaModule to handle Joda DateTime Objects.
         * https://github.com/FasterXML/jackson-datatype-jsr310
         */
        mapper.registerModule(new JSR310Module());
        mapper.setSerializationInclusion(Include.NON_EMPTY);
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

    }

    @Override
    public ObjectMapper getContext(Class<?> arg0) {
        return mapper;
    }
}

如果您将应用程序部署到 j2ee 容器中,您可能需要一个应用程序配置类:

@ApplicationPath("/api")
public class ApplicationConfig extends javax.ws.rs.core.Application{

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        // add here your resources
        classes.add(JacksonContextResolver.class);
        classes.add(JacksonJsonProvider.class);
        ...
        return classes;
    }

希望对您有所帮助。

【讨论】:

  • 拯救了我的一天!谢谢:)
  • 导入 net.sf.gazpachoquest.rest.support.JacksonContextResolver 的 maven 依赖是什么,不幸的是,我找不到它!非常感谢您的帮助。
  • net.sf.gazpachoquest.rest.support.JacksonContextResolver 的代码打印在上面的帖子中。从它说的地方开始:定义映射器的类:
【解决方案3】:

前段时间,当我没有在类路径中抛弃库时,我遇到了一个 json 请求的问题。 查看http://www.javatips.net/blog/2012/02/cxf-restful-tutorial 教程。

【讨论】:

    【解决方案4】:

    为了通过覆盖jettison来使用jackson库,你需要像下面这样配置jacksonprovider

    <bean id="jacksonJsonProvider" class="com.student.CustomJsonProvider"/>
    
    <jaxrs:providers> 
      <ref bean="jacksonJsonProvider" /> 
    </jaxrs:providers>
    

    【讨论】:

      【解决方案5】:

      在正常情况下,如果您通过简单地添加依赖项来部署到 EE 服务器,则必须自动发现和使用提供程序(我测试了宽度 TomEE 7):

      <dependency>
          <groupId>com.fasterxml.jackson.jaxrs</groupId>
          <artifactId>jackson-jaxrs-json-provider</artifactId>
          <version>2.8.6 </version>
      </dependency>
      

      但要小心使用正确的版本。 CFX 指南建议使用仅与 Jackson 1 兼容而不与 Jackson 2 兼容的 Jackson JAX-RS 提供程序。查看at that question 了解更多详细信息

      【讨论】:

        【解决方案6】:

        发生这种情况是因为当您使用带有组 com.fasterxml.jackson.jaxrs 的 jackson 库时,服务器期待以下格式的请求:

        {
          "LoginCredentials": {
            "AppId" : "BookStore",
            "Username":"myuser",
            "Password":"abcd1234",
            "SecurityToken":"Vcvx45YilzX1"
          },
          "SearchHeader":{
            "SearchCategory":"Rep",
            "FilterLogic":"1 AND 2",
            "SearchParams":{
              "Field":"Order Number (s)",
              "Operator":"EQUALS",
              "Values":"600045335"
            }
          }
        }
        

        但您的客户将发送以下格式:

        {
          "SearchOrdersRequest": {
            "LoginCredentials": {
              "AppId" : "BookStore",
              "Username":"myuser",
              "Password":"abcd1234",
              "SecurityToken":"Vcvx45YilzX1"
            },
            "SearchHeader":{
              "SearchCategory":"Rep",
              "FilterLogic":"1 AND 2",
              "SearchParams":{
                "Field":"Order Number (s)",
                "Operator":"EQUALS",
                "Values":"600045335"
              }
            }
          }
        }
        

        这似乎只是这个fasterxml 版本的库的问题。将库与组 org.codehaus.jackson 一起使用将解决此问题。请求和响应都将没有根元素。

        所以需要替换下面的maven依赖

        <dependency>
          <groupId>com.fasterxml.jackson.jaxrs</groupId>
          <artifactId>jackson-jaxrs-json-provider</artifactId>
          <version>2.9.3</version>
        </dependency>
        

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-jaxrs</artifactId>
            <version>1.9.13</version>
        </dependency>
        

        我检查了 cxf 文档 (https://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-Jackson) 中提到的库也是带有 com.fasterxml.jackson.jaxrs 的库,但是如果您检查 bean 中提到的类来自 org.codehaus.jackson.jaxrs。所以我认为这是文档中的错误,需要更正。

        【讨论】:

        • 结束评论仍然有效,这似乎仍然是一个文档问题。
        猜你喜欢
        • 2012-10-08
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 2014-02-12
        • 1970-01-01
        相关资源
        最近更新 更多