Java 捕获cxf在camel上下文中引发的异常

Java 捕获cxf在camel上下文中引发的异常,java,exception,apache-camel,cxf,jbossfuse,Java,Exception,Apache Camel,Cxf,Jbossfuse,如何在camel上下文中捕获cxf提供程序引发的异常。我正在尝试捕获camel上下文中ExceptionMapper引发的映射异常。 这是我的接球台 java.lang.Exception 假的 但是catch块不会捕获异常,因为cxf提供程序(com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider)正在抛出异常,ExceptionMapper正在设置响应。我的要求是捕获camel上下文中的所有异常,并将它们记录到数据库中。有什么方法可以在c

如何在camel上下文中捕获cxf提供程序引发的异常。我正在尝试捕获camel上下文中ExceptionMapper引发的映射异常。 这是我的接球台


java.lang.Exception
假的

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

您可以使用
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>

java.lang.Exception
真的
..

有关更多详细信息,请参见您可以使用
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>

java.lang.Exception
真的
..

有关更多详细信息,请参见您遇到了问题,因为
异常apper
包含异常,并且不会抛出异常

它是您的
异常外观
接口实现吗? 如果是这样,请尝试在
响应
方法中将异常作为
运行时异常重新抛出

如果没有,则通过扩展您使用的类来创建您自己的
异常apper
,并执行相同的操作


UPD:我想没有其他选项了

您遇到了问题,因为
ExceptionMapper
覆盖了一个异常,并且不会抛出它

它是您的
异常外观
接口实现吗? 如果是这样,请尝试在
响应
方法中将异常作为
运行时异常重新抛出

如果没有,则通过扩展您使用的类来创建您自己的
异常apper
,并执行相同的操作


UPD:我想没有其他选项了

您可以使用异常变量,如下所示

<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>

java.lang.Exception
${exception.message}

您可以使用异常变量,如下所示

<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>

java.lang.Exception
${exception.message}

OneException子路由不处理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();
    }
}
为了完整起见,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);
}
您的服务类可能是:

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);
}

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

OneException子路由不处理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();
    }
}
为了完整起见,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);
}
您的服务类可能是:

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);
}

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

是的ExceptionMapper实现设置响应,而不是将其作为运行时异常抛出。因此。。。重新抛出并捕获。是的,ExceptionMapper实现设置响应,而不是将其作为运行时异常抛出。因此。。。重新抛出并捕获。我问,问题不是如何处理捕获的异常,而是如何捕获它,因为没有异常。我问,问题不是如何处理捕获的异常,而是如何捕获它,因为没有异常。