在JAX中映射自定义异常

我正在开发一个带有JAX-RS / Apache CXFJSON的Client-Server应用程序

我希望Apache CXF能够在两端透明地处理异常:这意味着将异常转换为bean,使用Jackson序列化程序(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?)。

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


@WebFault's不属于JAX-RS规范的一部分。 您将需要阅读规范的第3.3.4节,其中描述了您可以完成您尝试执行的不同方式。

选项1

设计你的资源类来抛出WebApplicationException。 将这些异常的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
}

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

@得到

@路径(”/”)

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();
}

}

链接地址: http://www.djcxy.com/p/45617.html

上一篇: Mapping of custom exception in JAX

下一篇: how to remove or hide the Http response error using java