【问题标题】:Exchange via RestTemplate doesn't work with custom class通过 RestTemplate 交换不适用于自定义类
【发布时间】: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


【解决方案1】:

试试这个。这应该可以。

    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();           
       

【讨论】:

  • 对我不起作用。正如@DCTID 所说,关键是@NoArgsConstructor。在此之后,您的也可以使用。谢谢:=
猜你喜欢
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多