在微服务通信中使用带有ResponseEntity的RestTemplate时出现反序列化错误



我正在实现两个微服务之间的通信,其中Microservice 1使用RestTemplate向Microservice 2发送请求。在Microservice 1中,我在尝试使用ResponseEntity<Greeting>反序列化响应时遇到了一个问题。奇怪的是,当使用ResponseEntity<Object>时,它工作得很好。但是,我需要将响应作为Greeting类的实例,所以使用ResponseEntity<Object>并不是很有用。

那么我错过了什么?为了成功地将响应反序列化为Greeting对象,我需要做哪些不同的操作?

我收到以下错误消息:

There was an unexpected error (type=Internal Server Error, status=500).
Type definition error: [...Greeting]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 
Cannot construct instance of `...Greeting` (no Creators, like default constructor, exist):
Cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (PushbackInputStream); line: 1, column: 2]
org.springframework.http.converter.HttpMessageConversionException:
Type definition error: [simple type, class ...Greeting];
nested exception is .fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot construct instance of Greeting` (no Creators, like default constructor, exist):
cannot deserialize from Object value (no delegate- or property-based Creator)

在微服务1中调用的函数(在类GreetingsController中(:

...
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@ResponseBody
public Greeting getGreeting() {
....
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> requestEntity = new HttpEntity<>(requestHeaders);
// This one does not work
//ResponseEntity<Greeting> response = restTemplate.exchange("http://localhost:8081/greetings", HttpMethod.GET, requestEntity, Greeting.class, "get");
// only the following works
ResponseEntity<Object> response = restTemplate.exchange("http://localhost:8081/greetings", HttpMethod.GET, requestEntity, Object.class, "get");
...
return response.getBody(); 
}

这是微服务1中的问候类:

// some imports here
@Data
@AllArgsConstructor
public class Greeting {
@NotBlank
private Integer id;
@NonNull
private String text;
}

我尝试了各种在线教程,并尝试了RestTemplate提供的不同方法,如restTemplate.getForObject()restTemplate.getForEntity()restTemplate.exchange()。不幸的是,这些方法都没有与Greeting类结合使用。

试试这个。这应该行得通。

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);            
HttpEntity<?> requestEntity=new HttpEntity<>(requestHeaders);             
ParameterizedTypeReference<Greeting> responseType =  new ParameterizedTypeReference<Greeting>() {};    
ResponseEntity<Greeting> responseEntity = restTemplate.exchange(yourUrl,HttpMethod.GET, requestEntity,responseType); 
return response.getBody();           

相关内容

最新更新