【发布时间】:2020-12-05 22:36:12
【问题描述】:
我想实现两个微服务之间的通信。为此,在微服务 1 中,我尝试使用 RestTemplate 与微服务 2 交换数据。当我尝试使用 ResponseEntity<Greeting> 时,它不起作用。但是,当我使用ResponseEntity<Object> 时,它确实有效。显然使用第一种方法会好很多,因为我需要 Response 作为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)
我的问题:我错过了什么?使用Greeting 启动和运行它有什么问题?
代码
在微服务 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();
}
我的问候班:
// some imports here
@Data
@AllArgsConstructor
public class Greeting {
@NotBlank
private Integer id;
@NonNull
private String text;
}
到目前为止我尝试了什么?
我给了不同的在线教程一个机会。我尝试使用restTemplate.getForObject()、restTemplate.getForEntity() 和restTemplate.exchange()。它们都没有使用Greetings。
【问题讨论】:
-
当我请求 RestTemplate 时,你能告诉我响应 json 吗?
-
您需要为 Jackson 添加
@NoArgsConstructor。它创建一个空对象并使用反射来填充它。当它在 Java 中说“没有默认构造函数”时,意味着它需要一个没有任何参数的构造函数,当您添加@AllArgsConstructor时,默认值被删除。
标签: eclipse spring-boot microservices