我有一个流程,在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()
将引发WebApplicationException
if如果完成拦截器检查。您可以按期望的方式抓住它或将其扔掉
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中发生的事情(异常,错误消息返回)不会传播到