2013-01-18 63 views
5

JacksonJsonProvider不能與CXF一起使用。Jackson JSON不能與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,而我給請求爲「應用程序/ XML」和響應作爲「應用程序/ json」。

當我試圖通過將內容類型=應用程序/ JSON我對着500內部服務器錯誤

的要求越來越登錄通CXF日誌記錄的日誌文件給JSON的請求。

請求根本不在我的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"}}}} 

任何立即幫助表示讚賞。

回答

0

爲了通過覆蓋拋放使用傑克遜庫,你需要配置jacksonprovider像下面

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

<jaxrs:providers> 
    <ref bean="jacksonJsonProvider" /> 
</jaxrs:providers> 
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> 
    
+2

這還是經過2年的有效期 –

+0

如何repleace JAXRS:供應商提供純javaconfig(沒有XML? ) –

2

正如我undertood你,你的應用程序生產和消費XML和JSON格式。所以,首先。確保您的cxf資源端點能夠做到這一點。

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

否則您的請求將無法找到任何資源實現。(在這些線在類級或方法級)

然後,如果這不足夠看看這個傑克遜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 cont ainer,你可能需要一個應用程序配置類:

@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; 
    } 

希望得到這個幫助。

+0

保存我的一天!謝謝:) – L01c

+0

NP,歡迎您 –

0

在正常情況下,如果你通過簡單地添加依賴的供應商已經能夠自動發現並使用(我測試寬度TomEE 7)部署到EE服務器:

<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更多細節

相關問題