使用CXF拦截器处理错误 - 更改响应消息

时间:2012-04-08 16:00:58

标签: java rest soap error-handling cxf

我正在尝试处理来自我后端的错误。如果发生错误但是内容是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>

2 个答案:

答案 0 :(得分:14)

如果您正在使用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>

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

答案 1 :(得分:5)

这是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就应该愉快地映射这些签名。显然,链接包含更多细节。