使用 RestTemplate 时出错 - 使用 Apache Commons Multimap 反序列化对象时出现问题
Error when using RestTemplate - problem with deserialization of object with 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
我知道这是一般异常和映射器 return 它每次都会有任何异常。
所以我找到了真正的原因:
找不到非具体地图类型 [地图类型; class org.apache.commons.collections4.MultiMap, [简单类型, class java.lang.String] -> [简单类型, class 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 的方法吗?我可以使用 guava,但我不想只为 Multimap 添加 Guava 库。
您可以使用 Spring 谓词映射代替 Apache conman APP。
像下面这样导入语言。
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
并像下面这样利用多地图。
MultiValueMap<String, Integer> multiValueMap=new LinkedMultiValueMap<>();
您可以使用 SimpleModule
class 指示要为 MultiMap
使用哪种类型。见以下代码:
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]]}
我正在尝试使用服务中的 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我知道这是一般异常和映射器 return 它每次都会有任何异常。
所以我找到了真正的原因: 找不到非具体地图类型 [地图类型; class org.apache.commons.collections4.MultiMap, [简单类型, class java.lang.String] -> [简单类型, class 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 的方法吗?我可以使用 guava,但我不想只为 Multimap 添加 Guava 库。
您可以使用 Spring 谓词映射代替 Apache conman APP。 像下面这样导入语言。
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
并像下面这样利用多地图。
MultiValueMap<String, Integer> multiValueMap=new LinkedMultiValueMap<>();
您可以使用 SimpleModule
class 指示要为 MultiMap
使用哪种类型。见以下代码:
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]]}