我正在使用 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吗?)。
如果你能指出一些有用的例子,我将不胜感激。 感谢。
答案 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();
}
}