问题描述
我使用raml-to-jaxrs-plugin生成了api,并创建了JAXRSClientFactoryBean对象来调用它。
var clientFactoryBean = new JAXRSClientFactoryBean();
objectMapper.registerModule(new MyJacksonModule());
clientFactoryBean.setProvider(new JacksonJsonProvider(objectMapper));
现在,我正在尝试使用apache.cxf和javax.ws.rs-api解析响应,但仍然出现异常:
Caused by: java.lang.IllegalArgumentException: Cannot find a deserializer for non-concrete Map type [map type; class javax.ws.rs.core.MultivaluedMap,[simple type,class java.lang.String] -> [collection type; class java.util.List,contains [simple type,class java.lang.String]]]
这是代码:
api的一部分[生成]
@Path("/customers")
public interface CustomerApi {
@POST
@Produces("application/json")
@Consumes("application/json")
PostCustomersResponse postCustomers(
@HeaderParam("callTimeout") int callTimeout,@HeaderParam("Content-Type") String contentType,CustomerPOSTRequest entity);
class PostCustomersResponse extends ResponseDelegate {...}
....
}
public class ResponseDelegate extends Response {
....
@Override
public MultivaluedMap<String,Object> getHeaders() {
return this.delegate.getHeaders();
}
响应扩展[已生成]
public class ResponseDelegate extends Response {
private final Response delegate;
....
@Override
public MultivaluedMap<String,Object> getHeaders() {
return this.delegate.getHeaders();
}
}
MyService类:
class MyCustomerService {
....
@Override
public String processCustomer(MyCustomerRequest customerRequest) {
CustomerPOSTRequest request = prepareRequest(customerRequest);
CustomerApi.PostCustomersResponse response = customerApi.postCustomers("5",APPLICATION_JSON_VALUE,request);
return response.readEntity(String.class);
}
我试图同时将json作为String以及作为Response对象,但是遇到了同样的错误。调用api方法processCustomer时已引发异常。
我已经看到了另一个主题,并尝试构建here之类的解决方案,但这无济于事。
public class MyJacksonModule extends SimpleModule {
public MyJacksonModule()
{
addKeyDeserializer(
MultivaluedMap.class,new MultivaluedMapClassKeyDeserializer());
}
}
实际上,我什至不需要任何MultivaluedMap字段,但是我发现它是生成的api类(扩展javax.ws.rs.core.Response的ResponseDelegate)的一部分
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)