在POST操作期间在Jersey中捕获SAXNotRecognizedException

时间:2012-10-04 22:49:27

标签: rest spring-mvc jersey

我正在玩并转换Spring MVC REST项目以使用Jersey,并在我的一个类中使用

注释了一个方法
@ExceptionHandler(HttpMessageNotReadableException.class)

将在XML消息的反序列化期间捕获任何异常。这样我可以检测用户何时在POST请求中发送错误的XML并返回XML错误响应而不是400/500标准HTML错误页面。

泽西岛有类似的东西吗?我尝试创建一个异常映射类

@Provider
public class HttpMessageNotReadableException 
      implements ExceptionMapper<org.xml.sax.SAXNotRecognizedException> {

但是,当我从资源类中抛出异常时,似乎没有捕获任何进入的错误。

所以我想让我的方法获取字符串并进行反序列化并捕获任何错误:

@POST
@Path("/product")
public Response createProduct(String createRequest) {
      try {
         // de-serialize
         // do work ...
      } catch ...

而不是

@POST
@Path("/product")
public Response createProduct(CreateProduct createRequest) {
    // do work ...

但这似乎不对,只是用同样的错误检查来污染我的所有类。

我还阅读了使用

实现自己的阅读器
@Provider
class MyXmlReader implements MessageBodyReader {

但这似乎就像重新发明轮子一样,因为JAXB已经在进行反序列化,我只想抓住错误。

任何人都知道是否有更好的方法来捕获错误的传入XML?

1 个答案:

答案 0 :(得分:2)

Jersey使用与Spring完全相同的@Provider方法(在JAX-RS中定义)。我不知道Spring如何/ marshall对象,但Jersey默认使用JAXB for XML和JSON(如果你告诉它,可以使用Jackson for JSON)。

您是否尝试过捕获JAXB异常?

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBException;

@Provider
public class JAXBExceptionMapper implements ExceptionMapper<JAXBException> {
    public Response toResponse(JAXBException exception) {
        return Response.status(Status.BAD_REQUEST).build();
    }
}