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);
}
很抱歉重新打开一个旧话题,但这是来之不易的知识。