【问题标题】:catch exceptions thrown by cxf in camel context在骆驼上下文中捕获 cxf 抛出的异常
【发布时间】:2017-03-23 07:32:42
【问题描述】:

我们如何在骆驼上下文中捕获 cxf 提供程序抛出的异常。我试图在骆驼上下文中捕获 ExceptionMapper 引发的映射异常。 这是我的捕获块。

<doCatch>
<exception>java.lang.Exception</exception> 
  <handled>
      <constant>false</constant>
  </handled>
 </doCatch>

但异常没有被 catch 块捕获,因为 cxf 提供程序 (com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider) 正在抛出异常并且 ExceptionMapper 正在设置响应。我的要求是捕获骆驼上下文中的所有异常并将它们记录到数据库中。有什么办法可以捕捉 cxf 在骆驼中抛出的异常?

【问题讨论】:

    标签: java exception apache-camel cxf jbossfuse


    【解决方案1】:

    您可以使用onException 块来捕获CamelContext 中抛出的所有异常。

    <camelContext ....>
     <onException>
        <exception>java.lang.Exception</exception>
    
        <handled>
          <constant>true</constant>
        </handled>
    
        <bean ref="logAction" method="updateErrorStatus" />
    
        <log message="Exception in camel route!!!" />
      </onException>
    
      <route ..>
        ..
      </route>
    </camelContext>
    

    详情请见camel documentation

    【讨论】:

      【解决方案2】:

      你有一个问题,因为ExceptionMapper 涵盖了一个异常并且没有抛出它。

      是你的ExceptionMapper接口实现吗? 如果是这样,请尝试在toResponse 方法中重新抛出异常为RuntimeException

      如果不通过扩展您使用的 Class 创建自己的 ExceptionMapper 并执行相同操作。

      UPD:我想没有其他选择

      【讨论】:

      • 是的,ExceptionMapper 实现设置响应而不是将其作为运行时异常抛出。
      • 所以......重新扔它并抓住它。
      【解决方案3】:

      你可以像这样使用异常变量。

      <doCatch id="_doCatch1">
                      <exception>java.lang.Exception</exception>
                      <transform id="_transform2">
      
                          <simple>
                              ${exception.message}
                          </simple>
                      </transform>
                      <log id="log_exit_exception" message="Error - Exception: ${exception.message}" />
                  </doCatch>
      

      【讨论】:

      • 我的问题不是如何处理捕获的异常,而是如何捕获它,因为没有异常。
      【解决方案4】:

      onException 子路由不处理 CXF 端点内的 JAX-RS json 提供程序抛出的异常。它似乎只在交易所开始沿途旅行时才处理异常。

      要处理格式错误的 json 等,您还需要提供一个 JAX-RS ExceptionMapper,它会直接向用户返回响应:

      @Component(JaxrsExceptionMapper.BEAN_NAME)
      class JaxrsExceptionMapper implements ExceptionMapper<Throwable> {
      
          static final String BEAN_NAME = "jaxrsExceptionMapper";
      
          @Override
          public Response toResponse(Throwable t) {
              return Response
                  .status(Response.Status.BAD_REQUEST)
                  .entity(new MyResponseBody(t.getMessage()))
                  .type(MediaType.APPLICATION_JSON)
                  .build();
          }
      }
      

      JAX-RS @Provider 注解在 Camel 中不起作用。配置端点时,您需要将 ExceptionMapper bean“命名”为提供者。这与您的 JsonProvider bean 一起使用 - 这在 Camel 文档中远未明确。

      from("cxfrs://" + publishedUrl
                  + "?resourceClasses=" + MyJaxrsService.class.getName()
                  + "&bindingStyle=SimpleConsumer"
                  + "&providers=" + JaxrsJsonProviderConfig.BEAN_NAME
                      + "," + JaxrsExceptionMapper.BEAN_NAME)
          .to("direct:wherever");
      

      为了完整起见,Jackson json 提供程序的 spring 配置可能是:

      class JaxrsJsonProviderConfig {
      
          static final String BEAN_NAME = "jaxrsJsonProvider";
      
          @Bean(name = BEAN_NAME)
          public JacksonJsonProvider jaxrsJsonProvider(ObjectMapper objectMapper) {
              return new JacksonJsonProvider(objectMapper);
          }
      
          @Bean
          public ObjectMapper objectMapper() {
              ObjectMapper mapper = new ObjectMapper();
              // optional stuff ...
              mapper.registerModule(new ParameterNamesModule());
              mapper.registerModule(new Jdk8Module());
              mapper.registerModule(new JavaTimeModule());
              mapper.setSerializationInclusion(Include.NON_ABSENT);
              return mapper;
          }
      }
      

      您的服务类别可能是:

      public interface MyJaxrsService{
          @POST
          @Path("/myservice")
          MyResponseBody myService(MyPayload body);
      }
      

      很抱歉重新打开一个旧话题,但这是来之不易的知识。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        相关资源
        最近更新 更多