8

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

我还没有找到任何适当的文档可以告诉我如何做到这一点......

这些示例用于 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);
    }

}

上下文.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>
4

2 回答 2

15

如果您使用的是 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>

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

于 2012-04-10T21:49:34.737 回答
5

是你的另一块拼图。您已经在使用JAX-RS,那么为什么不使用JAX-WS呢?

此线程此博客文章涵盖将异常映射到 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 就会愉快地映射它们。显然,这些链接包含更多详细信息。

于 2012-04-15T21:45:23.767 回答