[英]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提供程序並包括依賴項。 但是,當我嘗試添加傑克遜而不是拋棄時,仍然出現錯誤,幾小時后,我發現您需要再添加一個傑克遜依賴項。
添加JSON提供程序
<jaxrs:providers> <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" /> </jaxrs:providers>
添加依賴項
<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.jaxrs
組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
。 所以我認為這是文檔中的錯誤,需要更正。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.