我有一个像下面这样的控制器
@Controller("myController")
@RequestMapping("api")
public class MyController {
@RequestMapping(method = RequestMethod.GET, value = "/get/info/{id}", headers = "Accept=application/json")
public @ResponseBody
Student getInfo(@PathVariable String info) {
.................
}
@ExceptionHandler(Throwable.class)
@ResponseStatus( HttpStatus.EXPECTATION_FAILED)
@ResponseBody
public String handleIOException(Throwable ex) {
ErrorResponse errorResponse = errorHandler.handelErrorResponse(ex);
return errorResponse.toString();
}
}
控制器具有错误处理机制,在错误处理选项中,它总是返回期望失败状态代码417。但我需要设置一个动态错误Http状态代码,如500,403等,取决于错误的类型。我该怎么做?
您需要更改输出值ResponseEntity的类型。在这里回答:如何在一个返回字符串的spring MVC@ResponseBody方法中响应HTTP 400错误?
您可以为您的API使用一个方面。如果您为服务定义了@around拦截器,则可以更改响应内容。
根据上面的代码,您需要更加小心地处理和抛出的异常。为Throwable设置异常处理程序似乎过于宽泛。
我这样做的方法是用我的XML/JSON封送处理注释创建一个ErrorMessage类。
@XmlRootElement(name = "error")
public class ErrorMessage {
private Throwable exception;
private String message;
public ErrorMessage() {
this.message = "";
}
public ErrorMessage(String message) {
this.message = message;
}
public ErrorMessage(Throwable exception) {
this.exception = exception;
this.message = exception.getLocalizedMessage();
}
@XmlTransient
@JsonIgnore
public Throwable getException() {
return exception;
}
public void setException(Throwable exception) {
this.exception = exception;
}
@XmlElement(name = "message")
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
有了这些,我倾向于创建我自己的应用程序异常,然后创建我的异常处理程序方法,例如:
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseBody
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorMessage handleResourceNotFoundException(ResourceNotFoundException e, HttpServletRequest req) {
return new ErrorMessage(e);
}
@ExceptionHandler(InternalServerErrorException.class)
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorMessage handleInternalServerErrorException(InternalServerErrorException e, HttpServletRequest req) {
return new ErrorMessage(e);
}
有了这些,我只需要从我的控制器方法中抛出适当的异常。例如,如果我抛出一个ResourceNotFoundException,那么spring会将其重定向到handleResourceNotFoundException方法,该方法返回一个404,并且还会返回表示错误的JSON或XML。