我们如何捕获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在驼峰中抛出的异常?
答案 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);
}
很抱歉重新打开一个旧主题,但这是来之不易的知识。