Spring mvc - 为XML和JSON响应配置错误处理

时间:2016-12-05 10:08:01

标签: spring spring-mvc spring-restcontroller

我有一个REST API方法:它将返回Xml作为响应。为简单起见,假设它抛出简单的异常。

@RequestMapping(value = "machine/xmlData", method = RequestMethod.GET, produces = "application/xml")
    public ResponseEntity<String> getXml(HttpServletRequest request)
            throws Exception {
        return getDataFromService();

}

现在我正在这样处理REST控制器中的异常。 这是一般的异常处理方法,也适用于其他API方法。(Xml或JSON响应)

 @ExceptionHandler(Exception.class)
        @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
        public ResponseEntity HandleException(Exception ex, HttpServletRequest request) {
            ex.printStackTrace();
           // here logic to generate Custom error Object
            return new ResponseEntity<Object>(customErrorObject, HttpStatus.INTERNAL_SERVER_ERROR);
        }

案例1:接受:&#34; application / xml&#34;来自服务的有效回复              一切正常。

案例2:接受:&#34; application / xml&#34;和服务例外              然后我得到 406 Not Representable

根据我的理解,它是

  

因为HandleException的ResponseEntity是JSON并接受标头   是&#34; application / xml&#34;这就是为什么我得到406。

无论如何,我可以将错误来自HandleException方法的响应发送为xml和json 吗? 我知道在REST API方法中我们可以定义类似这样的produces={"application/json","application/xml"}我正在努力将它放在HandleException方法上。

任何提示都会有很大的帮助。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用@ResponseBody注释(https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc)来利用spring-mvc HttpMessageConverters。此注释负责为给定的响应类型选择正确的messageConverter。

要使您的响应与xml或json兼容,您需要执行以下操作:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class WrappedExceptionResponse {
    public String respone;

    public String getRespone() {
        return respone;
    }

    public void setRespone(String respone) {
        this.respone = respone;
    }
}

并将您的异常处理程序方法更改为

    @ExceptionHandler(Exception.class)
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    public @ResponseBody WrappedExceptionResponse HandleException(Exception ex, HttpServletRequest request) {
//        ex.printStackTrace();
       // here logic to generate Custom error Object
        WrappedExceptionResponse resp=new WrappedExceptionResponse();
        resp.setRespone(ex.getMessage());
    return resp;

然后您的异常响应将取决于您提供的内容类型。