如何 return 在 apache camel 中自定义异常响应
how to return customized response on exception in apache camel
我正在使用 Apache camel 和 jboss fuse,我创建了下面列出的示例路由蓝图
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:camel="http://camel.apache.org/schema/blueprint"
xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<cxf:rsServer address="/testservice" id="testserver" serviceClass="com.company.HelloBean">
<camelContext id="testContext" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
<route id="testRoute" >
<from id="_from1" uri="cxfrs:bean:testserver"/>
<bean beanType="com.company.HelloBean"
id="_bean1" method="hello"/>
</route>
</camelContext>
</blueprint>
和 java class 实现它
@Path("/testservicenew")
public class HelloBean {
@POST
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String hello(Person name ) {
return "Hello:"+name.getName();
}
}
但是当我发送错误的 JSON 它 returns 错误的请求时,我使用了一些自定义拦截器,因此我可以使用自定义的 body 和 header 来控制返回的响应
您可以将自定义异常处理程序定义为
@Provider
public class ExceptionHandler implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable exception) {
System.out.println("Exception type:" + exception.getClass().getCanonicalName());
exception.printStackTrace();
if (exception instanceof BadRequestException) {
return Response.status(Response.Status.BAD_REQUEST)
.header("unexpected request data", "BadRequestExceptiont").build();
}
return Response.status(Response.Status.REQUEST_TIMEOUT).header("Problemo", "yes problemo").build();
}
}
你可以在你的路线中定义它来使用这个class
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:camel="http://camel.apache.org/schema/blueprint"
xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<cxf:rsServer address="/testservice" id="testserver" serviceClass="com.company.HelloBean">
<cxf:providers>
<bean class="com.company.ExceptionHandler" id="securityException"/>
</cxf:providers>
</cxf:rsServer>
<camelContext id="testContext" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
<route id="testRoute" >
<from id="_from1" uri="cxfrs:bean:testserver"/>
<bean beanType="com.company.HelloBean"
id="_bean1" method="hello"/>
</route>
</camelContext>
</blueprint>
我正在使用 Apache camel 和 jboss fuse,我创建了下面列出的示例路由蓝图
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:camel="http://camel.apache.org/schema/blueprint"
xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<cxf:rsServer address="/testservice" id="testserver" serviceClass="com.company.HelloBean">
<camelContext id="testContext" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
<route id="testRoute" >
<from id="_from1" uri="cxfrs:bean:testserver"/>
<bean beanType="com.company.HelloBean"
id="_bean1" method="hello"/>
</route>
</camelContext>
</blueprint>
和 java class 实现它
@Path("/testservicenew")
public class HelloBean {
@POST
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String hello(Person name ) {
return "Hello:"+name.getName();
}
}
但是当我发送错误的 JSON 它 returns 错误的请求时,我使用了一些自定义拦截器,因此我可以使用自定义的 body 和 header 来控制返回的响应
您可以将自定义异常处理程序定义为
@Provider
public class ExceptionHandler implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable exception) {
System.out.println("Exception type:" + exception.getClass().getCanonicalName());
exception.printStackTrace();
if (exception instanceof BadRequestException) {
return Response.status(Response.Status.BAD_REQUEST)
.header("unexpected request data", "BadRequestExceptiont").build();
}
return Response.status(Response.Status.REQUEST_TIMEOUT).header("Problemo", "yes problemo").build();
}
}
你可以在你的路线中定义它来使用这个class
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:camel="http://camel.apache.org/schema/blueprint"
xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<cxf:rsServer address="/testservice" id="testserver" serviceClass="com.company.HelloBean">
<cxf:providers>
<bean class="com.company.ExceptionHandler" id="securityException"/>
</cxf:providers>
</cxf:rsServer>
<camelContext id="testContext" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
<route id="testRoute" >
<from id="_from1" uri="cxfrs:bean:testserver"/>
<bean beanType="com.company.HelloBean"
id="_bean1" method="hello"/>
</route>
</camelContext>
</blueprint>