除非主体为空,否则Spring @ExceptionHandler不会返回内容

我正在使用Spring @ControllerAdvice处理异常

@ControllerAdvice

public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

@ExceptionHandler(value = { DataIntegrityViolationException.class})

@ResponseBody

public ResponseEntity<String> unknownException(Exception ex, WebRequest req) {

return new ResponseEntity<>(ex.getCause().getMessage(), new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);

}

我遇到的问题是,发生异常时(当我通过招摇发送请求时),我没有收到预期的异常消息,但是:

{"error": "no response from server"}

Response Code : 0

Response Body : No Content

我可以清楚地看到在调试模式下,被注释的方法@ExceptionHandler被调用。

我已经试验了方法的返回类型@ResponseBody@ResponseStatus注释和来考虑一些其他的事情,但似乎我只得到一些非空的响应,当我返回一个ResponseEntity没有身体,如

 ResponseEntity.noContent().build()

要么

ResponseEntity.ok().build()

在这种情况下,我会获得正确的http代码和一些标题

请告知我我做错了什么

  • spring版本4.3.9
  • spring启动版本1.5.4

先感谢您

我进行了实验,这是对我有用的解决方案。它非常接近答案之一-我将标记为已接受

简而言之,我刚刚创建了自己的dto类,并用我感兴趣的异常详细信息填充了实例,然后直接将其返回。

@ExceptionHandler(value = { DataIntegrityViolationException.class})

@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)

@ResponseBody

public ExceptionDetailHolder unknownException(Exception ex, WebRequest req) {

final Throwable cause = ex.getCause();

return new ExceptionDetailHolder("Error interacting with the database server",

cause.getClass() + ":" + cause.getMessage(),

cause.getCause().getClass() + ":" + cause.getCause().getMessage()

);

}

@AllArgsConstructor

@NoArgsConstructor

@Getter

@Setter

private class ExceptionDetailHolder {

private String message;

private String exceptionMessage;

private String innerExceptionMessage;

}

结果(还显示了评论者要求的ex.getMessage和ex.getCause()。getMessage()的内容):

{

"message": "Error interacting with the database server",

"exceptionMessage": "class org.hibernate.exception.ConstraintViolationException:could not execute statement",

"innerExceptionMessage": "class com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:Column 'allow_copay_payments' cannot be null"

}

回答:

我处理异常的方式如下所示,在这种情况下,我找到了特定的异常,然后创建了自己的类对象ValidationErrorDTO,然后填充该类中的必填字段(ValidationErrorDTO):

@ExceptionHandler(HttpMessageNotReadableException.class)

@ResponseStatus(HttpStatus.BAD_REQUEST)

@ResponseBody

public ResponseEntity<ValidationErrorDTO> processValidationIllegalError(HttpMessageNotReadableException ex,

HandlerMethod handlerMethod, WebRequest webRequest) {

Throwable throwable = ex.getMostSpecificCause();

ValidationErrorDTO errorDTO = new ValidationErrorDTO();

if (throwable instanceof EnumValidationException) {

EnumValidationException exception = (EnumValidationException) ex.getMostSpecificCause();

errorDTO.setEnumName(exception.getEnumName());

errorDTO.setEnumValue(exception.getEnumValue());

errorDTO.setErrorMessage(exception.getEnumValue() + " is an invalid " + exception.getEnumName());

}

return new ResponseEntity<ValidationErrorDTO>(errorDTO, HttpStatus.BAD_REQUEST);

}

以上是 除非主体为空,否则Spring @ExceptionHandler不会返回内容 的全部内容, 来源链接: utcz.com/qa/398794.html

回到顶部