在春季3中,是否可以动态设置@ResponseStatus的原因?

2022-09-01 04:31:57

我有一个自定义异常类,用于返回给定的:HttpStatus

@ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="Invalid parameter")
public class BadRequestException extends RuntimeException
{
  public BadRequestException(String msg)
  {
    super(msg);
  }
}

当我从控制器抛出一个时,这有效,但原因总是“无效参数” 当然。有没有办法在此类中设置返回的原因?我想传递一个字符串作为原因。BadRequestException

谢谢!


答案 1

如果在自定义异常的@ResponseStatus注释中省略了“reason”属性,

@ResponseStatus(value = HttpStatus.CONFLICT)  // 409
public class ChildDataExists extends RuntimeException {
...

然后在服务层中引发异常。因此,您不需要在控制器中捕获并抛出其他内容或捕获来将响应直接设置为某些HTTP状态代码。

throw new ChildDataExists("Can't delete parent if child row exists.");

异常的消息作为 JSON 输出中“数据”的“消息”出现。注释中的“原因”似乎覆盖了自定义行为。因此,您可以为给定的上下文提供一个基本异常,并在十几个位置使用它,每个位置都有一个略有不同的消息,其中它被抛出并且所有消息都得到了正确的处理到REST接口。


答案 2

您可以使用 的函数来实现此目的。
以下是如何使用它的示例:HttpServletResponsesendError

@RequestMapping(value = "some/url", method = RequestMethod.POST)
public void doAction(final HttpServletResponse response) throws IOException {
  response.sendError(HttpStatus.BAD_REQUEST.value(), "custom error message");
}

推荐