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

如何在Spring Boot中将异常抛回JSON

艾星河
2023-03-14

我有一个请求-

  @RequestMapping("/fetchErrorMessages")
  public @ResponseBody int fetchErrorMessages(@RequestParam("startTime") String startTime,@RequestParam("endTime") String endTime) throws Exception
  {
      if(SanityChecker.checkDateSanity(startTime)&&SanityChecker.checkDateSanity(endTime))
      {
          return 0;
      }
      else
      {
          throw new NotFoundException("Datetime is invalid");
      }
  }

如果开始时间和结束时间无效,我想抛出一个500错误,但在JSON中返回异常字符串。然而,我得到一个超文本标记语言页面,而不是说

白标错误页面

此应用程序没有/error的显式映射,因此您将其视为一种回退。

Wed Dec20 10:49:37IST 2017
出现意外错误(type=内部服务器错误,状态=500)。
Datetime无效

相反,我想用JSON返回500

{"error":"Date time format is invalid"}

我该怎么做?

共有3个答案

葛和志
2023-03-14

您可以使用@ResponseStatus注释创建NotFoundException类,如下所示:

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public class NotFoundException extends RuntimeException {
   public NotFoundException() {
   }

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

}
李耀
2023-03-14

创建自定义异常。

public class SecurityException extends RuntimeException {

    private static final long serialVersionUID = -7806029002430564887L;

    private String message;

    public SecurityException() {
    }

    public SecurityException(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

创建自定义响应实体。

public class SecurityResponse {

    private String error;

    public SecurityResponse() {

    }

    public SecurityResponse(String error) {
        this.error = error;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }

}

为自定义异常创建一个ControllerAdvice with ExceptionHandler,它将处理自定义异常,填充并返回自定义响应,如下所示。

@ControllerAdvice
public class SecurityControllerAdvice {

    @ExceptionHandler(SecurityException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public SecurityResponse handleSecurityException(SecurityException se) {
        SecurityResponse response = new SecurityResponse(se.getMessage());
        return response;
    }
}

根据您的条件引发自定义异常。

throw new SecurityException("Date time format is invalid");

现在运行并测试你的应用程序。例如:

轩辕越泽
2023-03-14

假设您有一个自定义异常类NotFoundException,其实现如下:

public class NotFoundException extends Exception {

    private int errorCode;
    private String errorMessage;

    public NotFoundException(Throwable throwable) {
        super(throwable);
    }

    public NotFoundException(String msg, Throwable throwable) {
        super(msg, throwable);
    }

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

    public NotFoundException(String message, int errorCode) {
        super();
        this.errorCode = errorCode;
        this.errorMessage = message;
    }


    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }

    public int getErrorCode() {
        return errorCode;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    @Override
    public String toString() {
        return this.errorCode + " : " + this.getErrorMessage();
    }
}

现在你想从控制器抛出一些异常。如果你抛出一个异常,那么你必须从一个标准的错误处理程序类中捕捉它,例如在Spring,他们提供了@Controlller建议注释来应用于创建一个类标准错误处理程序。当它应用于一个类时,这个Spring组件(我是说你注释的类)可以捕捉从控制器抛出的任何异常。但是我们需要用正确的方法映射异常类。所以我们用你的异常NotFoundExctive处理程序定义了一个方法,如下所示。

@ControllerAdvice
public class RestErrorHandler {

    @ExceptionHandler(NotFoundException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public Object processValidationError(NotFoundException ex) {
        String result = ex.getErrorMessage();
        System.out.println("###########"+result);
        return ex;
    }
}

您希望将http状态发送到内部服务器错误(500),因此这里我们使用了@ResponseStatus(HttpStatus.internal_server_error)。因为您使用了Spring boot,所以不需要生成json字符串,只需要一个简单的注释@ResponseBody就可以自动生成json字符串。

 类似资料:
  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • @apiResponse似乎也没有更正响应类型。 如本问题所述,如何在swagger Codegen中处理多个响应/返回类型(204为空,400为非空等)? 我可以这样扔 但是有没有更好的方法来做到这一点呢?我只想将.getResponseBody()作为对象而不是字符串返回。 非常感谢。

  • 我知道JVM有一个异常表,它映射在给定字节码索引中可以抛出的可能异常。我还读到athrow字节码抛出了堆栈顶部存在的引用类型的exception。我的问题更多地涉及像irem这样的指令如何“抛出”异常。 JVM是否会在每次指令执行后检查堆栈的顶部,以检查是否存在异常?如果你能洞察到这件事的话,你会很感激的。

  • 版本: 我得到以下错误:

  • 我正在制作一个小应用程序,我可以使用spring-boot保存用户详细信息。我创建了实体及其相应的存储库。当我发出帖子请求以添加用户的用户对象的id时,该id在保存到数据时为空base.Thisid在MySQL中自动生成(自动增量)。从POST请求中,我得到3个字段,即用户名、电子邮件、密码。用户类包含字段id、用户名、电子邮件、密码。我添加了注释 作为 id 字段。构造函数是 我的用户服务类 我

  • 我在Spring/Hibernate网络应用程序上有以下代码: 实体: 听众: 此代码在实体上每次更新或持久化后调用。问题在于,当为负数量引发异常时,hibernate将上的