我有一个请求映射-
@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"); } }
如果startTime和endTime无效,我想抛出500错误,但以JSON返回异常字符串。但是,我得到一个HTML页面,而不是说
白标错误页面 此应用程序没有针对/ error的显式映射,因此您将其视为后备。 IST 2017年12月20日星期三10:49:37 发生意外错误(类型=内部服务器错误,状态= 500)。 日期时间无效
白标错误页面
此应用程序没有针对/ error的显式映射,因此您将其视为后备。
IST 2017年12月20日星期三10:49:37 发生意外错误(类型=内部服务器错误,状态= 500)。 日期时间无效
相反,我想用JSON返回500
{"error":"Date time format is invalid"}
我该怎么办?
假设您有一个自定义的Exception类NotFoundException及其实现,如下所示:
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说,它们提供了@ControllerAdvice注释以应用于制作标准错误处理程序类。当将它应用于类时,该spring组件(我是说您注释的类)可以捕获从控制器抛出的任何异常。但是我们需要使用适当的方法来映射异常类。因此,我们为您的异常NotFoundException处理程序定义了一种方法,如下所示。
@ControllerAdvice
@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状态 发送 到内部服务器error(500) ,因此在这里我们使用@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)。由于您使用了Spring- boot,因此您无需制作json字符串,只需简单的注释@ResponseBody即可自动完成。
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody