未找到序列化器 返回 ResponseEntity 时出现问题,包括异常
No serializer found Problem returning ResponseEntity including exception
我正在制作 RESTful API 用于练习。
我想要有效检查请求正文并制作 ExceptionHandler.class 如下所示。
@Override
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request){
List<String> errorList = ex
.getBindingResult()
.getFieldErrors()
.stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toList());
ApiResponse apiResponse=new ApiResponse(HttpStatus.BAD_REQUEST, ex.getMessage(), errorList, ex);
return new ResponseEntity<>(
apiResponse, HttpStatus.BAD_REQUEST
);
}
我在 ResponseEntity<> 中为响应主体制作了 ApiResponse.class。
@Data
@Slf4j
public class ApiResponse{
public HttpStatus status;
public String msg;
public List<String> err;
public Exception ex;
public ApiResponse(HttpStatus status, String msg, List<String> err, Exception ex){
this.status=status;
this.msg=msg;
this.err=err;
this.ex=ex;
}
}
但是当 MethodArgumentNotValidException 发生时,我得到如下错误...
Caused by:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No
serializer found for class
org.springframework.validation.DefaultMessageCodesResolver and no
properties discovered to create BeanSerializer (to avoid exception,
disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference
chain: com.practice.skillup.restfulapi.dto.ApiResponse["ex"]-
这是什么原因,我该如何解决。 (我只是一个 web 开发初学者,非常感谢能轻松解释)
出现这个问题是因为实体是延迟加载的,而序列化过程是在实体完全加载之前执行的。 Jackson 尝试序列化嵌套对象,但失败了,因为它找到了 JavassistLazyInitializer 而不是普通对象。
根据您的堆栈跟踪,您可以通过将以下配置添加到您的 application.properties 文件来抑制此错误:-
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
这只会隐藏错误,不会解决问题。要解决此问题,您可以使用 Jackson 的附加模块来处理 Hibernate 延迟加载。在这里查看更多信息:- Jackson-datatype-hibernate, .
我正在制作 RESTful API 用于练习。 我想要有效检查请求正文并制作 ExceptionHandler.class 如下所示。
@Override
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request){
List<String> errorList = ex
.getBindingResult()
.getFieldErrors()
.stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toList());
ApiResponse apiResponse=new ApiResponse(HttpStatus.BAD_REQUEST, ex.getMessage(), errorList, ex);
return new ResponseEntity<>(
apiResponse, HttpStatus.BAD_REQUEST
);
}
我在 ResponseEntity<> 中为响应主体制作了 ApiResponse.class。
@Data
@Slf4j
public class ApiResponse{
public HttpStatus status;
public String msg;
public List<String> err;
public Exception ex;
public ApiResponse(HttpStatus status, String msg, List<String> err, Exception ex){
this.status=status;
this.msg=msg;
this.err=err;
this.ex=ex;
}
}
但是当 MethodArgumentNotValidException 发生时,我得到如下错误...
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.springframework.validation.DefaultMessageCodesResolver and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.practice.skillup.restfulapi.dto.ApiResponse["ex"]-
这是什么原因,我该如何解决。 (我只是一个 web 开发初学者,非常感谢能轻松解释)
出现这个问题是因为实体是延迟加载的,而序列化过程是在实体完全加载之前执行的。 Jackson 尝试序列化嵌套对象,但失败了,因为它找到了 JavassistLazyInitializer 而不是普通对象。
根据您的堆栈跟踪,您可以通过将以下配置添加到您的 application.properties 文件来抑制此错误:-
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
这只会隐藏错误,不会解决问题。要解决此问题,您可以使用 Jackson 的附加模块来处理 Hibernate 延迟加载。在这里查看更多信息:- Jackson-datatype-hibernate,