0

我正在使用JAX-RS / Apache CXFJSON开发客户端-服务器应用程序

我希望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 吗?)。

如果您能指出一些工作示例,我将不胜感激。谢谢。

4

2 回答 2

3

@WebFault's不是 JAX-RS 规范的一部分。您将需要阅读规范的第 3.3.4 节,其中描述了您可以完成您正在尝试做的事情的不同方法。

选项1

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

选项 2

定义异常映射提供程序。您可以创建它们的层次结构来处理您的应用程序将抛出的所有常见异常。或者,您可以使用嵌入式 bean 及其异常处理程序创建顶级异常。然后从顶层导出几个特定的​​例外。

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

    // Constructors, setters/getters
}

@Provider
public class MyApplicationExceptionHandler implements ExceptionMapper<MyApplicationException<?>> {
    // Implementation
}
于 2013-01-21T15:45:22.900 回答
0

一种方法是使用 javax.ws.rs.core.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();
}

}

于 2013-01-21T15:39:45.260 回答