杰克逊JSON不与CXF合作

时间:2013-01-18 13:41:53

标签: json cxf jackson

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:server .....&gt;

<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"}}}} 

任何直接的帮助表示赞赏。

6 个答案:

答案 0 :(得分:3)

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>
    

答案 1 :(得分: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;
    }

希望得到这个帮助。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

<bean id="jacksonJsonProvider" class="com.student.CustomJsonProvider"/>

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

答案 4 :(得分:0)

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

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

但要小心使用正确的版本。 CFX指南建议杰克逊JAX-RS提供商仅与杰克逊1兼容,而不与杰克逊2兼容。查看at that question了解更多详情

答案 5 :(得分:0)

之所以发生这种情况,是因为当您将杰克逊库与组com.fasterxml.jackson.jaxrs一起使用时,服务器期望以下格式的请求:

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