【问题标题】:Error handling with CXF interceptors - changing the response message使用 CXF 拦截器处理错误 - 更改响应消息
【发布时间】:2012-04-21 07:03:02
【问题描述】:

我正在尝试处理来自我的后端的错误。如果发生错误但内容是 XmlMessage 的实例,则调用 handleMessage()。我想将其更改为我自己的响应 - 只需设置响应代码并添加一些消息。

我没有找到任何合适的文档可以告诉我如何执行此操作...

这些示例用于 REST,但我也想在 SOAP 中管理这个东西。

拦截器

public class ErrorHandlerInterceptor extends AbstractPhaseInterceptor<Message> {

    public ErrorHandlerInterceptor() {
        super(Phase.POST_LOGICAL);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        Response response = Response
            .status(Response.Status.BAD_REQUEST)
            .entity("HOW TO GET A MESSAGE FROM AN EXCEPTION IN HERE???")
            .build();
        message.getExchange().put(Response.class, response);
    }

}

context.xml

<bean id="errorHandlerInterceptor"
    class="cz.cvut.fit.wst.server.interceptor.ErrorHandlerInterceptor" />

<jaxrs:server address="/rest/">
    <jaxrs:serviceBeans>
        <ref bean="restService" />
    </jaxrs:serviceBeans>
    <jaxrs:outFaultInterceptors>
        <ref bean="errorHandlerInterceptor" />
    </jaxrs:outFaultInterceptors>
</jaxrs:server>

【问题讨论】:

    标签: java rest soap error-handling cxf


    【解决方案1】:

    如果您使用的是 JAX-RS,为什么不设置一个异常映射器,然后使用该映射器来处理响应。

    一个简单的例子:

    @Provider
    @Produces(MediaType.APPLICATION_JSON)
    public class MyExceptionMapper implements
            ExceptionMapper<MyException> {
    
        @Override
        public Response toResponse(MyException e) {
            return Response.status(Status.NOT_FOUND).build();
        }
    
    }
    

    然后您需要通过添加以下内容在 jaxrs 服务中注册提供程序:

    <jaxrs:providers>
        <bean class="com.blah.blah.blah.blah.MyExceptionMapper"/>  
    </jaxrs:providers>
    

    在上下文中的服务器配置中。有了它,您就可以完全访问异常,并且可以从中获取任何您想要的东西。

    【讨论】:

    • 如果我想使用 SOAP 怎么办?我该如何处理?与 JAX-RS 相同,还是我必须使用拦截器?
    • 对于肥皂,我认为你必须使用拦截器。我一直无法弄清楚我需要做什么才能在 CXF 的肥皂产品中工作。对我来说幸运的是,这不是什么大问题,但 jax-rs 的方式似乎要好得多。
    • 如果我有以下情况怎么办。我有一个执行验证的拦截器。我也有一个异常处理程序。如果我想从拦截器中抛出我的自定义异常,我的异常处理程序的 toResponse 方法会被调用吗?
    • 你可以回答这个问题stackoverflow.com/questions/17079790/…
    • 如果已设置自动扫描(),则无需注册。
    【解决方案2】:

    这里是the other piece of your puzzle。您已经在使用JAX-RS,为什么不也使用JAX-WS

    This threadthis blog post 涵盖将异常映射到 SOAP 错误。短而甜:

    JAX-WS 2.0规范要求@WebFault注解的异常必须有两个构造函数和一个方法【获取故障信息的getter】:

    WrapperException(String message, FaultBean faultInfo)
    WrapperException(String message, FaultBean faultInfo, Throwable cause)
    FaultBean getFaultInfo()
    

    WrapperException 被替换为异常的名称,FaultBean 被替换为实现故障 bean 的类名。故障 bean 是一个 Java bean,包含故障信息,Web 服务客户端使用它来了解故障原因。

    还有你的映射。只需在 @WebFault 的上下文中指定上述签名的实现,您的 SOAP API 就会愉快地映射它们。显然,这些链接包含更多详细信息。

    【讨论】:

    • 谢谢。我还不接受你的回答为了瓜分你们两个的名声
    • @Tomas 虽然努力是高尚的(我很高兴我提供了帮助!),但不幸的是,isn't how the bounty system works (details)。我不愿意为您协调这一点,因为我在结果中占有一席之地,但是如果您认为有两个答案值得,则可以选择授予额外的赏金。抱歉,添麻烦了;系统不是我写的。 :)
    • 哦,那太糟糕了。我决定这样做:我向 mjwenk 提供赏金,因为声誉对他的帮助比对您的帮助更大,并且接受您的回答,因为您同时拥有 REST 和 SOAP 的链接。我想这是唯一公平的方式(或至少一点点)。谢谢你提到它...
    • @Tomas 完全合理!感谢您在这件事上光明磊落,并让我知道。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    相关资源
    最近更新 更多