java 无法从Spring 6 / SpringBoot 3.0反序列化错误响应异常

qnakjoqk  于 2022-12-28  发布在  Java
关注(0)|答案(1)|浏览(161)

我创建了一个@RestControllerAdvice来处理所有ErrorResponseException异常(包括我自己的类NtErrorResponseException,它扩展了ErrorResponseException异常)。

@RestControllerAdvice
public class NtExceptionHandling extends ResponseEntityExceptionHandler {

    @ExceptionHandler(NtErrorResponseException.class)
    ProblemDetail handleBookmarkNotFoundException(NtErrorResponseException e) {
        return e.getBody();
    }
}

但是当我尝试使用这个测试来测试它时,我得到了下面的错误:

测试

@Test
    void problemTest(@Autowired TestRestTemplate restTemplate) {
        final ResponseEntity<ErrorResponseException> problem = restTemplate.getForEntity("/api/hello-world/problem", ErrorResponseException.class);
        assertThat(problem.getStatusCode().value()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR.value());
        assertThat(problem.getBody()).isNotNull();
    }

错误

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.springframework.web.ErrorResponseException]

(...)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.web.ErrorResponseException` (no Creators, like default constructor, exist): Throwable needs a default constructor, a single-String-arg constructor; or explicit @JsonCreator
 (...)

问题错误为无法构造org.springframework.web.ErrorResponseException的示例(不存在创建者,如默认构造函数):Throwable需要一个默认构造函数,一个单字符串参数构造函数;或者explicit @JsonCreator,这在ErrorResponseException没有默认构造函数时是有意义的,但是当它没有默认构造函数时,我应该如何测试它呢?我希望Spring已经使ErrorResponseException类易于反序列化?
我解决这个问题的好办法是什么?

myzjeezk

myzjeezk1#

Spring Boot从控制器返回的反序列化对象不是ErrorResponseException,而是ProblemDetail
修复:

@Test
void problemTest(@Autowired TestRestTemplate restTemplate) {
    final ResponseEntity<ProblemDetail> problem = restTemplate.getForEntity("/api/hello-world/problem", ProblemDetail.class);
    assertThat(problem.getStatusCode().value()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR.value());
    assertThat(problem.getBody()).isNotNull();
}

相关问题