在JAX中映射自定义异常
我正在开发一个带有JAX-RS / Apache CXF , JSON的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