9

JacksonJsonProvider 不适用于 CXF。

CXF v2.6.0 Jackson 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 Internal Server Error

该请求通过 CXF 日志记录在日志文件中。

该请求根本没有登陆我的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"}}}} 

任何即时帮助表示赞赏。

4

6 回答 6

3

CXF 文档中,您可以看到需要添加 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>
    
于 2013-05-08T20:06:46.490 回答
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;
    }

希望这有帮助。

于 2015-01-26T13:21:35.923 回答
0

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

于 2013-01-18T21:12:32.597 回答
0

为了通过覆盖 jettison 来使用 jackson 库,您需要配置 jacksonprovider,如下所示

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

<jaxrs:providers> 
  <ref bean="jacksonJsonProvider" /> 
</jaxrs:providers>
于 2013-03-17T19:14:42.077 回答
0

发生这种情况是因为当您使用带有 group 的 jackson 库时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 文档中提到的库(https://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-Jackson)也是一个,com.fasterxml.jackson.jaxrs但是如果你检查类豆类中提到的来自org.codehaus.jackson.jaxrs. 所以我认为这是文档中的一个错误,需要更正。

于 2019-07-18T13:40:52.480 回答
0

在正常情况下,如果您通过简单地添加该依赖项来部署到 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 提供程序。有关更多详细信息,请查看该问题

于 2017-03-21T20:35:44.697 回答