1

亲爱的骆驼用户!请告诉我

1)我的设计一般有什么问题?(我确信这不是最佳的)

2) 在 Exchange 正文中使用 POJO 的正确方法是什么?

我的 Grails Web 应用程序需要通过一些中间步骤与远程 Web 服务交互:

  1. 创建请求 xml
  2. 验证此 xml
  3. 使用 dsig 签署 xml
  4. 将签名的 xml 发送到网络服务
  5. 验证响应签名
  6. 验证响应 XML
  7. 处理响应

每个步骤都可能引发异常,必须在页面上显示。像这样:“步骤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”。

4

0 回答 0