弹簧响应状态异常不返回原因

2022-08-31 13:31:25

我有一个非常简单的,我正在尝试设置一个自定义错误消息。但是由于某种原因,for错误没有显示出来。@RestControllermessage

这是我的控制器:

@RestController
@RequestMapping("openPharmacy")
public class OpenPharmacyController {


    @PostMapping
    public String findNumberOfSurgeries(@RequestBody String skuLockRequest) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "This postcode is not valid");
    }

}

这是我得到的回应:

{
    "timestamp": "2020-06-24T17:44:20.194+00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "",
    "path": "/openPharmacy/"
}

我正在传递一个JSON,但我没有验证任何东西,我只是试图设置自定义消息。如果我更改状态代码,我会在响应中看到该代码,但 始终为空。message

为什么这不能像预期的那样工作?这是一个如此简单的例子,我看不出可能缺少什么。当我调试代码时,我可以看到错误消息设置了所有字段。但由于某种原因,消息永远不会在响应上设置。


答案 1

这个答案是由用户Hassan在对原始问题的评论中提供的。我只是将其作为答案发布,以使其具有更好的可见性。

基本上,您需要做的就是添加到 application.properties 文件中,现在应该填充您的消息字段。server.error.include-message=always

此行为在Spring Boot 2.3中已更改,您可以在此处阅读:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#changes-to-the-default-error-pages-content


答案 2

我有同样的问题。如果我使用此构造

throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Error in update");

我的消息未通过 传递给客户端。对我来说,绕过它的唯一方法是创建类JSONGlobalExceptionHandler

package mypackage;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import java.util.Date;

@ControllerAdvice
public class GlobalExceptionHandler {
  @ExceptionHandler(NotFoundException.class)
  public ResponseEntity<ErrorDTO> generateNotFoundException(NotFoundException ex) {
    ErrorDTO errorDTO = new ErrorDTO();
    errorDTO.setMessage(ex.getMessage());
    errorDTO.setStatus(String.valueOf(ex.getStatus().value()));
    errorDTO.setTime(new Date().toString());

    return new ResponseEntity<ErrorDTO>(errorDTO, ex.getStatus());
  }
}

我还创建了自己的类型Exception

package mypackage;

import org.springframework.http.HttpStatus;

public class NotFoundException extends RuntimeException {

  public NotFoundException(String message) {
    super(message);
  }

  public HttpStatus getStatus() {
    return HttpStatus.NOT_FOUND;
  }
}

这样,我就可以从控制器抛出异常,并且我得到了正确的结果 - 我想看到的消息。JSON

@PutMapping("/data/{id}")
public DataEntity updateData(@RequestBody DataEntity data, @PathVariable int id) {
  throw new NotFoundException("Element not found");
}

我也不得不介绍ErrorDTO

package mypackage;

public class ErrorDTO {
  public String status;
  public String message;
  public String time;

  ...
  ...
  // getters and setters are here 
  ...
  ...
}

更新

正如@Hassan和@cunhaf(在原始问题下的评论中)所提到的,解决方案

server.error.include-message=always

与.尽管如此,如果有人想通过异常传递更多信息,解决方案可能会更好。ResponseStatusExceptionGlobalExceptionHandler

源码

可在此处找到示例:全局异常处理程序


推荐