使用RestTemplate时发生错误-使用Apache Commons Multimap对对象进行反序列化的问题

时间:2019-07-18 12:10:54

标签: java spring-boot jackson apache-commons multimap

我正在尝试使用服务中的RestTemplate对象。

HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    headers.setContentType(MediaType.APPLICATION_JSON);

    HttpEntity<BusinessPartnerRequest> entity = new HttpEntity<>(request, headers);

    ResponseEntity<Analysis> result = restTemplate.exchange(url, HttpMethod.POST, entity, Analysis.class);

不幸的是,我每次都获得例外。例外:

无法提取响应:找不到针对响应类型[class com.abb.bttr.validator.Analysis]和内容类型[application / json; charset = UTF-8]的HttpMessageConverter

我知道这是一般异常,并且每次出现任何异常时,映射器都会将其返回。

所以我找到了真正的原因: 找不到非具体地图类型[地图类型; org.apache.commons.collections4.MultiMap类,[简单类型,类java.lang.String]-> [简单类型,类java.lang.Object]]

我的分析对象:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.MapSerializer;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import org.apache.commons.collections4.MultiMap;
import org.apache.commons.collections4.map.MultiValueMap;

    @JacksonXmlRootElement
    public class Analysis {
        private Boolean error = false;
        @JsonSerialize(keyUsing = MapSerializer.class)
        private MultiMap<String, String> errorDetails = new MultiValueMap<>();

        //getter, setters, constructors, equals and hashcode
    }

您知道一种快速地反序列化ApacheCommons MultiMap的方法吗?我可以使用番石榴,但是我不想只为Multimap添加番石榴库。

2 个答案:

答案 0 :(得分:1)

您可以使用Spring谓词Map代替Apache conman APP。 如下所示导入语言。

import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

并使用如下所示的多地图。

 MultiValueMap<String, Integer> multiValueMap=new LinkedMultiValueMap<>();

答案 1 :(得分:0)

您可以使用MultiMap类来指示要用于SimpleModule的类型。参见下面的代码:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.IOException;
import org.apache.commons.collections4.MultiMap;
import org.apache.commons.collections4.map.MultiValueMap;

public class JsonApp {

  public static void main(String[] args) throws IOException {
    MultiMap<String, String> multiMap = new MultiValueMap<>();
    multiMap.put("a", "AA");
    multiMap.put("a", "AAA");
    multiMap.put("b", "B");
    multiMap.put("b", "BB");

    SimpleModule collections4Module = new SimpleModule();
    collections4Module.addAbstractTypeMapping(MultiMap.class, MultiValueMap.class);

    ObjectMapper jsonMapper = new ObjectMapper();
    jsonMapper.registerModule(collections4Module);

    String json = jsonMapper.writeValueAsString(multiMap);
    System.out.println(json);
    System.out.println(jsonMapper.readValue(json, MultiMap.class));
  }
}

上面的代码显示:

{"a":["AA","AAA"],"b":["B","BB"]}
{a=[[AA, AAA]], b=[[B, BB]]}