2012-04-08 130 views
7

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

我还没有发现任何适当的文件,其能告诉我如何做到这一点?

这些axamples是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> 

回答

5

而这里的the other piece of your puzzle。你已经在使用JAX-RS,那么为什么不使用JAX-WS呢?

This thread and this blog post封面映射例外到SOAP错误。短和甜:

,例外与@WebFault注释必须有两个构造函数和一个方法[吸气剂,以获得故障信息]的JAX-WS 2.0规范要求:

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

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

还有你的映射。只需在@WebFault的上下文中指定上述签名的实现,并且您的SOAP API应该愉快地映射这些签名。显然,链接包含更多细节。

+0

谢谢。我不接受你的回答,为了分享你们之间的声望 – user219882 2012-04-15 22:18:48

+0

@Tomas虽然努力是高尚的(我很高兴我帮了忙!),不幸的是,[这不是赏金系统的工作原理]( http://meta.stackexchange.com/questions/2786/accept-multiple-answers-or-split-bounty-among-several-users)([details](http://meta.stackexchange.com/questions/16065) /如何 - 做最赏金系统工作/ 16067#16067))。我为你调和这件事感到不自在,因为我对结果有一定的兴趣,但是如果你觉得有两个答案是值得的,则可以选择授予额外的奖励。抱歉,添麻烦了;我没有写这个系统。 :) – MrGomez 2012-04-15 22:31:55

+0

哦,那太糟糕了。我决定这样做:我给予mjwenk赏金,因为声望可以帮助他比你更多并接受你的答案,因为你有链接到REST和SOAP。我想这是唯一公平的方式(或者至少是一点点)。谢谢你提到它... – user219882 2012-04-16 00:06:34

13

如果您使用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> 
在上下文中的服务器配置

。有了这个,你可以完全访问这个例外,并且可以从它得到你想要的任何东西。

+0

如果我想使用SOAP呢?我该如何处理?与JAX-RS相同,还是我必须拦截? – user219882 2012-04-10 22:26:12

+0

对于肥皂,我认为你必须使用拦截器。我从来没有能够弄清楚我需要做什么才能在CXF的肥皂工作。幸运的是,对我来说这不是什么大问题,但是jax-rs的方式似乎更好。 – mjwenk 2012-04-10 23:37:03

+0

如果我有以下情况,该怎么办?我有一个执行验证的拦截器。我也有一个异常处理程序。如果我想从拦截器中抛出我的自定义异常,我的异常处理程序的toResponse方法是否会被调用? – Bhuvan 2013-06-13 04:45:17