当前位置: 首页 > 面试题库 >

将异常从CXF拦截器传播到异常映射器

慕嘉运
2023-03-14
问题内容

我有一个流程,在CXF客户端上我安装了拦截器,提供程序和异常映射程序。就我而言,我正在通过拦截器捕获来自客户端的不良响应,然后我想中止cxf总线链并引发故障。不幸的是我做不到,因为在每种情况下都只记录从拦截器抛出的异常,但是主要错误(错误的json格式)会传播到异常映射器。我想避免使用异常映射器,但是我不知道怎么做。我正在使用WebClient来实现这样的拦截器:

@Component
public class MyInterceptor extends AbstractPhaseInterceptor<Message> {

    public MyInterceptor() {
        super(POST_STREAM);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        if (message != null) {
                //message.getExchange().setOneWay(true);
                //message.getExchange().put(Exception.class, new MyException());
                //message.getInterceptorChain().abort();
                //message.setContent(Exception.class, new MyException());
                //Endpoint ep = message.getExchange().get(Endpoint.class);
                //message.getInterceptorChain().abort();
                //if (ep.getInFaultObserver() != null) {
                //    ep.getInFaultObserver().onMessage(message);
                //}
                //throw new WebApplicationException( new MyException());

                //message.setContent(Response.class, response);
                throw new Fault(new MyException());
            }
        }

我读到我应该实现jaxrs-filter,因为拦截器引发的异常不会传播到异常映射器。多亏了WebClient的实现,在Java中有没有办法做到这一点?

S client = create(url, clazz, list(jsonProvider(), providers));
WebClient.getConfig(client).getInInterceptors().add(new MyInterceptor());

我也尝试过在拦截器上使用不同的阶段,但是也没有用。


问题答案:

我一直在研究和测试您的问题。问题是从CXF拦截器抛出的异常逃避了JAX-
RS流(请参阅
CXF团队的答案)

Fault从拦截器产生可以被获取,实现handleFault在拦截器本身

 public void handleFault(Message message) {
       Exception e = message.getContent(Exception.class);
 }

或实施FaultListener并在CXF总线上注册

WebClient.getConfig(client).getBus().getProperties().put("org.apache.cxf.logging.FaultListener",new MyFaultListener());

public class MyFaultListener implements FaultListener{
    public boolean faultOccurred(final Exception exception,final String description,final Message message) {
        //return false to avoid warning of default CXF logging interceptor
        return false;
    }
}

但是您不能从拦截器返回自定义响应,也不能对客户端响应故障。

我发现实现所需行为的解决方法是将Response替换为可以由您的常规方法调用处理的自定义对象

进入Interceptor.handleMessage检查你所需要的条件,并创建一个Response自定义状态和实体。之后,停止链条

public class MyInterceptor extends AbstractPhaseInterceptor<Message> {

    public MyInterceptor() {
        super(Phase.POST_STREAM);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        if (message != null) {
            //check the condition to raise the error 
            //build the custom Response replacing service call
            Response response = Response
                    .status(Response.Status.BAD_REQUEST)
                    .entity("custom error")
                    .build();
            message.getExchange().put(Response.class, response);

            //abort interceptor chain in you want to stop processing or throw a Fault (catched by handleFault)
            //message.getInterceptorChain().abort();
            //throw new Fault (new MyException());

        }

    public void handleFault(Message messageParam) {
    }
}

创建JAXRS客户端时,将ResponseExceptionMapper添加为提供者

providers.add(new ResponseExceptionMapper<WebApplicationException>() {

    @Override
    public WebApplicationException fromResponse(Response r) {
        return new WebApplicationException(r);
    }

});

YourService proxy = JAXRSClientFactory.create(url, clazz,providers);
Client client = WebClient.client(proxy);
WebClient.getConfig(client).getInInterceptors().add(new MyInterceptor());

此后,对的调用proxy.yourService()将引发WebApplicationExceptionif如果完成拦截器检查。您可以按期望的方式抓住它或将其扔掉

try{
    proxy.yourService();
}catch (WebApplicationException e){
}

希望这可以帮助



 类似资料:
  • 我有一个流程,在CXF客户机上,我在拦截器、提供者和异常映射器中有JAXR。在我的例子中,我通过截取程序捕捉到来自客户端的错误响应,然后我想中止cxf总线链并抛出一个错误。不幸的是,我无法做到这一点,因为在任何情况下,拦截器抛出的异常都只会被记录,但主要错误(错误的json格式)会传播到异常映射器。我想避免使用异常映射器,但我不知道如何避免。我使用WebClient实现如下拦截器: 我读到应该实现

  • 我的项目是基于spring mvc的,我写了一个拦截器来拦截请求,我想从请求中获取参数,下面是我的代码: 但现在它抛出了一个异常: 出现例外的原因是什么?

  • 我有一个.NET应用程序,其中有一个用于接收用户请求的控制器,一个服务调用另一个服务。我在中有一些代码,当用户请求值不正确时,我查询数据库(DynamoDB)并得到500错误的响应。我想处理这个问题,这样我就可以捕捉到这个错误/异常,并将错误消息连同一个400状态码一起从控制器发回给用户。我应该如何修改代码来做到这一点? 这是我尝试过的。目前,我只是在中打印错误,但我需要将其发送到控制器。通过抛出

  • 我正在努力使用Java Spring Hibernate,我正在尝试实现Oauth2,在通过@ManyToMany将表用户连接到角色时,我不断遇到错误。我已经阅读了所有关于我的问题的答案,无论我尝试什么,我仍然得到了一个组织。冬眠映射异常。 以下是我正在努力做的事情的全部细节。 数据库结构 角色。JAVA 使用者JAVA 依赖性 问题: org.springframework.beans.fact

  • 问题内容: 我正在使用Java 8的可完成的Future,并且希望能够处理将来抛出的异常并将其转换为其他异常。 一旦发生异常,我尝试过的所有复合材料似乎都会短路。 例如,使用scala future,我可以执行以下操作: 并且我希望能够在将来的Java复合块中模仿它。这可能吗? 问题答案: 您可以使用。例如 如果完成并带有异常,则将完成并带有潜在转换的异常。否则,它将具有相同的成功结果值。 关于我

  • 我有一个问题,我已经解决了一段时间,加上我是apache camel的新手,它没有帮助。 我的简单应用程序使用CXF(使用jetty作为http引擎)公开SOAP web服务,然后使用Camel将SOAP请求传递给akka参与者。 我希望在通往actor的道路上验证SOAP请求,并检查它是否包含某些头部和内容值。我不想使用CXF拦截器。问题是,camel中发生的事情(异常,错误消息返回)不会传播到