捕获cxf在camel上下文中抛出的异常

时间:2017-03-23 07:32:42

标签: java exception apache-camel cxf jbossfuse

我们如何捕获cxf提供程序在camel上下文中抛出的异常。我试图抓住在camel上下文中由ExceptionMapper抛出的Mapping异常。 这是我的捕获块。

c1.set(2017, 12 , 01); //Ex: 1999 jan 20    //System.out.println("Date is : " + sdf.format(c1.getTime()));
  c1.add(Calendar.MONTH, -2); // substract 1 month
  System.out.println
  ("Date minus 1 month : "
      + sdf.format(c1.getTime()));

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

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您遇到问题,因为ExceptionMapper涵盖了异常并且不会引发异常。

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

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

UPD:我猜没有其他选择

答案 2 :(得分:0)

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

<form method="POST" action="contactInfo.php">
<center>
Name: <input type="text" name="name"/>
Email: <input type="text" name="email"/> 
<input type ="submit" name="submitted" value="Submit" /> <br />
<?php
$formSubmitted = $_POST['submitted'];
if ($formSubmitted)
{
  echo "Thank you for your information.";
} ?>

答案 3 :(得分:0)

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

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