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"}}}}
任何直接的帮助表示赞赏。
答案 0 :(得分:3)
在CXF documentation中,您可以看到需要添加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>
答案 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
。所以我认为这是文档中的错误,需要更正。