我有一个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方法上。
任何提示都会有很大的帮助。
感谢。
答案 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;
然后您的异常响应将取决于您提供的内容类型。