通过@WebFault批注在JAX-RS中映射自定义异常

时间:2013-01-21 15:27:28

标签: java json cxf jax-rs

我正在使用 JAX-RS / Apache CXF JSON

开发客户端 - 服务器应用

我希望 Apache CXF 在两端透明地处理我的异常:这意味着将异常转换为bean,使用我的Jackson Serializer(JSON)将其序列化,然后继续客户方。

我在这个主题上看过几个令人困惑的帖子/答案,并提出使用@WebFault注释:

@WebFault(name=CODE, faultBean="foo.bar.FaultBean")
public class DuplicateRuleNameFault extends Exception {
   static final public String CODE = "DUPLICATE_RULE_NAME";
   private FaultBean faultBean;

   public DuplicateRuleNameFault(String msg) {
     super(msg);
     this.faultBean = new FaultBean(msg);
   }
   public DuplicateRuleNameFault() {
   }
   public FaultBean getFaultBean() {
     return faultBean;
   }
   public void setFaultBean(FaultBean faultBean) {
     this.faultBean = faultBean;
   }
}

没有成功......目前,CXF似乎很乐意忽略Exception上的注释并将其作为未知异常处理:500状态错误,并且在服务器端没有生成响应主体。

我的Spring上下文的“”服务器元素中是否需要配置特定的内容?我已经有Spring扫描我的Exception / FaultBean类(它甚至需要BTW吗?)。

如果你能指出一些有用的例子,我将不胜感激。 感谢。

2 个答案:

答案 0 :(得分:3)

@WebFault's不是JAX-RS规范的一部分。您需要阅读规范的section 3.3.4,其中描述了您可以通过不同的方式完成您的目标。

选项1

设计资源类以抛出WebApplicationException's。将这些异常的response属性设置为包含要发送给客户端的故障bean的有效JAX-RS响应。

选项2

定义异常映射提供程序。您可以创建这些层次结构来处理应用程序将抛出的所有常见异常。或者,您可以使用嵌入式Bean和异常处理程序创建顶级异常。然后从顶级一个派生几个特定的​​例外。

public abstract class MyApplicationException<T> extends Exception {
    private T faultBean;

    // Constructors, setters/getters
}

@Provider
public class MyApplicationExceptionHandler implements ExceptionMapper<MyApplicationException<?>> {
    // Implementation
}

答案 1 :(得分:0)

这样做的一种方法是使用javax.ws.rs.core.Response对象,如下所示:

@GET

@Path(&#34; /&#34)

public Response getBlah()

{

try {
    return Response.status(Response.Status.OK)
            .entity(<Object you want to return>).build();
}
catch (final DuplicateRuleNameFault e) {
    return Response.status(Response.Status.BAD_REQUEST)
            .entity(e.getFaultBean().getMsg()).build();
}

}