簡體   English   中英

傑克遜JSON無法與CXF一起使用

[英]Jackson JSON not working with CXF

JacksonJsonProvider無法與CXF一起使用。

CXF v2.6.0 Jackson Jackson v2.1.2(com.fasterxml.jackson)RESTClient(用於測試)

我確實在bean.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 .....>

<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-logging記錄在日志文件中。

該請求根本沒有到達我的Web服務的服務實現類。

請求正文中的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"}}}} 

任何立即的幫助表示贊賞。

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> 

如我所知,您的應用程序生成並使用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;
    }

希望對您有所幫助。

一段時間前,當我在classpath中沒有jettison庫時,我遇到了json請求問題。 查看http://www.javatips.net/blog/2012/02/cxf-restful-tutorial教程。

為了通過覆蓋jettison來使用jackson庫,您需要像下面這樣配置jacksonprovider

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

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

在正常情況下,如果通過簡單地添加該依賴項來部署到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提供程序。請查看該問題以獲取更多詳細信息。

發生這種情況的原因是,當您將jackson庫與com.fasterxml.jackson.jaxrscom.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 所以我認為這是文檔中的錯誤,需要更正。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM