当前位置: 首页 > 知识库问答 >
问题:

Spring ResponseStatusException未返回原因

韩喜
2023-03-14

我有一个非常简单的< code>@RestController,我试图设置一个自定义的错误消息。但是由于某种原因,错误的< code >消息没有显示出来。

这是我的控制器:

@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,但我没有验证任何东西,我只是试图设置自定义消息。如果我更改状态代码,我会在响应中看到,但< code>message始终为空。

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

共有3个答案

程鸿煊
2023-03-14

奇怪的是,Spring Boot 2.6.x 再次更改了此行为,并且不返回在 ResponseStatusException 上设置的错误消息。为了解决这个问题,我不得不降级到2.5.6。最后我有这样的东西:

 @DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.OK)  
public MessageResponse deleteById(@PathVariable(value = "id") Integer id) {
    try {
        userService.deleteById(id); 
        
    } catch (Exception e) {
        throw new ResponseStatusException(HttpStatus.EXPECTATION_FAILED, "Error deleting user. User has dependencies", e);
    }
}
贺海
2023-03-14

我也有同样的问题。如果我使用这个构造

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

我的消息没有通过< code>JSON传递给客户端。对我来说,解决它的唯一方法是创建< code > GlobalExceptionHandler 类

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());
  }
}

我还创建了自己的< code >异常类型

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;
  }
}

这样,我就可以从控制器中抛出异常,并在<code>JSON<code>中得到正确的结果,这是我想要看到的消息

@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

ResponserStatusException完美配合。尽管如此,使用GlobalExceptionHandler的解决方案可能会更好,以防有人想通过Exception传递更多信息。

源代码

示例可以在这里找到:全局异常处理程序

景嘉志
2023-03-14

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

基本上,您需要做的就是添加<code>server.error。将消息=始终包含到应用程序中。属性文件,现在应该填充消息字段。

此行为在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

 类似资料:
  • 问题内容: 我有一个非常简单的,我正在尝试设置自定义错误消息。但是由于某种原因,该错误没有显示出来。 这是我的控制器: 这是我得到的答复: 我正在传递JSON,但我没有验证任何内容,我只是在尝试设置自定义消息。如果更改状态代码,则会在响应中看到它,但是始终为空。 为什么这不按预期工作?这是一个非常简单的示例,我看不到可能缺少的内容。当我调试代码时,我可以看到错误消息设置了所有字段。但是由于某种原因

  • 本文向大家介绍javascript 实现 原路返回,包括了javascript 实现 原路返回的使用技巧和注意事项,需要的朋友参考一下 css代码 html代码 javascript代码

  • 问题内容: 因此,当我打开灯箱时,我试图禁止在页面上滚动,而我发现这个确实有用的脚本非常有用。不幸的是,当我在自己的页面上使用它时,它也禁止在灯箱中滚动。我开始用警报调试代码,只是发现该事件。wheelDelta在我的页面上返回“undefined”,而在JSFiddle中,它返回-120。 问题答案: jQuery事件处理程序中的对象不能反映真实事件。是IE和Opera的非标准事件属性,可通过j

  • 我正在学习这个教程,它试图通过构建一个最小的JVM来最小化JVM内存占用。

  • 有很多使用OkHTTP3发出请求的例子,但是,我仍然无法发出正确的请求。据我所知,我的设置是正确的。 我不断收到如下所示的回复。我不知道他们是什么意思。 {“ContentLength”:238,“ContentTypeString”:“Application/JSON”,“Source”:{“Buffer”:{“Size”:0},“Closed”:False,“Source”:{“BytesRe

  • 环境 期望的行为 我想更新文档并返回原始文档。 实际行为 正在返回更新的文档,而不是原始文档。 我试过的 起初,我在查看findAndModify: http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#findAndModify 然而,那里的文档表示它已被弃用,并使用findOneAndUpdate、findOn