Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用RestTemplate时出错-使用Apache Commons Multimap反序列化对象时出现问题_Java_Spring Boot_Jackson_Apache Commons_Multimap - Fatal编程技术网

Java 使用RestTemplate时出错-使用Apache Commons Multimap反序列化对象时出现问题

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

我正在尝试使用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);
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。你有办法解决这个问题吗?