亲爱的骆驼用户!请告诉我
1)我的设计一般有什么问题?(我确信这不是最佳的)
2) 在 Exchange 正文中使用 POJO 的正确方法是什么?
我的 Grails Web 应用程序需要通过一些中间步骤与远程 Web 服务交互:
- 创建请求 xml
- 验证此 xml
- 使用 dsig 签署 xml
- 将签名的 xml 发送到网络服务
- 验证响应签名
- 验证响应 XML
- 处理响应
每个步骤都可能引发异常,必须在页面上显示。像这样:“步骤StepName发生错误,错误消息:消息”。
所以我想我更喜欢的模式是“请求-回复”。
我正在尝试使用一组处理器组装骆驼路线。每个处理器都像这样包裹在 .doTry() 中。
from("direct:sendServiceCatalog")
.doTry()
.process(new Processor() {
@Override
public void process(Exchange arg0) throws Exception {
System.out.println("PROCESSING");
throw new RuntimeException("Nice try");
}
})
.to("mock:result")
.doCatch(Exception.class)
.process(
new ExceptionStageDetectorProcessor(
SendServiceCatalogStage.FORM_XML))
.to("mock:catch")
.end();
ExceptionStageDetectorProcessor.java 类非常简单:
public class ExceptionStageDetectorProcessor implements Processor {
public ExceptionStageDetectorProcessor(SendServiceCatalogStage stage) {
this.stage = stage;
}
public SendServiceCatalogStage getStage() {
return stage;
}
private SendServiceCatalogStage stage;
@Override
public void process(Exchange exchange) throws Exception {
Throwable caughtException = (Throwable) exchange
.getProperty(Exchange.EXCEPTION_CAUGHT);
exchange.getOut().setBody(new ProcessError(stage, caughtException));
}
}
它几乎奏效了!:)
问题是不能使用新的主体ProcessError,当发生异常时返回的对象是错误字符串,而不是 ProcessError 对象。如果我尝试设置一个简单的字符串 .setBody("FOO") 返回对象正是“FOO”。