提问者:小点点

使用spring 3 restful以编程方式更改http响应状态


我有一个像下面这样的控制器

@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等,取决于错误的类型。我该怎么做?


共3个答案

匿名用户

您需要更改输出值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。