Camel+Spring-WS异常处理:如何返回自定义Body与500状态码?
在Camel + Spring-WS中返回自定义Body并设置HTTP 500状态码
当然可以实现!在 Camel + Spring-WS 环境下,你完全可以在返回自定义响应体(比如自定义Bean)的同时,将 HTTP 状态码设置为 500。你的思路是对的——用 onException 捕获异常,再通过处理器定制响应,但可能在细节上需要调整一下,我给你梳理完整的实现步骤:
1. 确保自定义错误Bean支持JAXB序列化
首先,你的自定义错误Bean(比如CustomError)必须添加JAXB注解,这样Camel才能把它序列化为XML(Spring-WS默认的响应格式):
package com.yourpackage.error; import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "CustomError") public class CustomError { private String errorCode; private String errorMessage; private String details; // 无参构造器(JAXB必需) public CustomError() {} // Getter和Setter方法 // ... }
2. 完善ExceptionProcessor处理器
你需要在处理器里完成两件核心事情:构造自定义错误Bean,以及设置HTTP 500状态码。调整后的处理器代码如下:
public class ExceptionProcessor implements Processor { @Override public void process(Exchange exchange) throws Exception { // 获取捕获到的RuntimeException RuntimeException e = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, RuntimeException.class); // 构造自定义错误Bean并填充异常信息 CustomError customError = new CustomError(); customError.setErrorCode("INTERNAL_ERROR"); customError.setErrorMessage(e.getMessage()); customError.setDetails("An unexpected error occurred during request processing"); // 设置HTTP 500响应状态码——Spring-WS会识别这个头并设置到HTTP响应中 exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 500); // 将自定义Bean设置为响应体(用OUT消息确保响应被正确返回) exchange.getOut().setBody(customError); // 标记异常已处理,避免Camel后续再抛出异常 exchange.setProperty(Exchange.EXCEPTION_HANDLED, true); } }
3. 调整Camel路由配置
确保你的onException配置正确关联JAXB序列化,并设置合适的响应头:
// 初始化JAXBDataFormat,指定自定义错误Bean所在的包 JAXBDataFormat jaxbErrorFormat = new JAXBDataFormat("com.yourpackage.error"); // 配置全局异常处理 onException(RuntimeException.class) .handled(true) // 标记异常已处理,等同于设置EXCEPTION_HANDLED为true .process(new ExceptionProcessor()) .marshal(jaxbErrorFormat) .setHeader(Exchange.CONTENT_TYPE, constant("application/xml")); // 明确设置响应Content-Type // 你的业务路由示例 from("spring-ws:endpoint:/services/yourService?endpointMapping=#endpointMapping") .bean(YourBusinessService.class, "processRequest") .marshal(jaxbBusinessFormat);
4. Spring-WS的特殊注意事项
- 如果你使用的是Spring-WS的
SpringWebserviceComponent,Camel会自动将Exchange.HTTP_RESPONSE_CODE头转换为HTTP响应状态码,无需额外配置。 - 确保你的JAXB上下文包含自定义错误Bean的包,否则会出现序列化失败的异常。可以通过在Spring配置中注册
Jaxb2Marshaller并指定包路径来全局配置。
这样配置后,当你的业务代码抛出RuntimeException时,Camel会捕获它,返回你定义的CustomError XML结构,同时HTTP状态码会被设置为500,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Pirulino
相关产品推荐
相关产品推荐

