Java 使用RestTemplate时出错-使用Apache Commons Multimap反序列化对象时出现问题
我正在尝试使用RestTemplate对象从服务中检索Java 使用RestTemplate时出错-使用Apache Commons Multimap反序列化对象时出现问题,java,spring-boot,jackson,apache-commons,multimap,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
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);
HttpHeaders=newhttpheaders();
setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity=新的HttpEntity(请求、头);
ResponseEntity result=restemplate.exchange(url、HttpMethod.POST、entity、Analysis.class);
不幸的是,我每次都有例外。这是一个例外:
无法提取响应:未找到响应类型[class com.abb.bttr.validator.Analysis]和内容类型[application/json;charset=UTF-8]的合适HttpMessageConverter
我知道这是一般的异常,每次出现异常时,mapper都会返回它
所以我找到了真正的原因:
找不到非具体映射类型[映射类型;类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
}
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
导入com.fasterxml.jackson.databind.ser.std.MapSerializer;
导入com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
导入org.apache.commons.collections4.MultiMap;
导入org.apache.commons.collections4.map.MultiValueMap;
@JacksonXmlRootElement
公共类分析{
私有布尔错误=false;
@JsonSerialize(keyUsing=MapSerializer.class)
私有多值映射errorDetails=新的多值映射();
//getter、setter、构造函数、equals和hashcode
}
您知道一种快速反序列化ApacheCommons MultiMap的方法吗?我可以使用guava,但我不想只为Multimap添加guava库。代替ApacheConman应用,您可以使用Spring谓词映射。 如下图所示导入口头表达
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
MultiValueMap<String, Integer> multiValueMap=new LinkedMultiValueMap<>();
并使用如下所示的多重映射
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
MultiValueMap<String, Integer> multiValueMap=new LinkedMultiValueMap<>();
MultiValueMap MultiValueMap=新链接的MultiValueMap();
您可以通过使用SimpleModule
类来指示要用于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));
}
}
也许可以帮助你?不幸的是,不能,因为我使用的是RestTemplate,而不是普通的ObjectMapper,而且我的多重映射在对象内部。对于Guava,只需要为映射器注册模块:messageConverter.getObjectMapper().registerModule(新的GuavaModule());对于Commons Multimap,我在互联网上找不到任何类似的内容。谢谢!但我在单独的maven项目中有一个模型,并且没有Spring,所以我不认为只为MultiMap添加Spring是一个好主意。这正是我想要的!它可以工作,谢谢。看起来当映射程序进行读取时,它错误地反序列化了对象。。。它使用键和作为值的多重映射将值放入ArrayList,而不是将值放入ArrayList。你有办法解决这个问题吗?