如何为非具体Map类型添加适当的Json解串器?

问题描述

我使用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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...