Java 使用HttpServletResponse与ResponseEntity处理Spring异常

Java 使用HttpServletResponse与ResponseEntity处理Spring异常,java,spring,spring-boot,spring-mvc,Java,Spring,Spring Boot,Spring Mvc,我尝试了两种不同的方法来实现MethodArgumentNotValidException的异常处理程序: 第一个使用ResponseEntity: @RestControllerAdvice 公共类GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) 公共响应句柄异常(MethodArgumentNotValidException e,HttpServletResponse) 抛出IO

我尝试了两种不同的方法来实现
MethodArgumentNotValidException
的异常处理程序:

第一个使用
ResponseEntity

@RestControllerAdvice
公共类GlobalExceptionHandler
{
@ExceptionHandler(MethodArgumentNotValidException.class)
公共响应句柄异常(MethodArgumentNotValidException e,HttpServletResponse)
抛出IOException
{
StringBuilder=新的StringBuilder();
Set errors=new HashSet();
对于(FieldError错误:e.getBindingResult().getFieldErrors())
{
builder.append(error.getField()).append(“具有无效值”).append(error.getRejectedValue()).append(“;”);
}
添加(builder.toString());
返回新的ResponseEntity(错误,org.springframework.http.HttpStatus.BAD_请求);
}
}
第二个直接使用
HttpServletResponse
发送响应:

@RestControllerAdvice
公共类GlobalExceptionHandler
{
@ExceptionHandler(MethodArgumentNotValidException.class)
public void handleException(MethodArgumentNotValidException e,HttpServletResponse)
抛出IOException
{
StringBuilder=新的StringBuilder();
对于(FieldError错误:e.getBindingResult().getFieldErrors())
{
builder.append(error.getField()).append(“具有无效值”).append(error.getRejectedValue()).append(“;”);
}
response.senderro(HttpStatus.SC_BAD_请求,builder.toString());
}
}
第一个按预期工作(通过返回右主体),但第二个返回主体中的spring默认消息(“对象验证失败…”等)


这些方法之间的区别是什么?是什么解释了这种差异?

sendError的javadoc对如何处理响应体有何说明?ResponseEntity表示Spring将响应序列化并作为JSON返回。HttpServletResponse.sendError不会进行JSON转换和标头更新。
sendError
的javadoc如何处理响应体?ResponseEntity指示Spring序列化并将响应作为JSON返回。HttpServletResponse.sendError将不会执行JSON转换和标头更新。