2

我们正在使用 Spring Integration 处理传递到 RESTful 端点的 JSON 有效负载。作为此流程的一部分,我们使用过滤器来验证 JSON:

.filter(schemaValidationFilter, s -> s
    .discardFlow(f -> f
        .handle(message -> {
            throw new SchemaValidationException(message);
        }))
)

这很好用。但是,如果验证失败,我们希望捕获解析错误并将其返回给用户,以便他们可以对错误采取行动。这是SchemaValidationFilter 类中重写的接受方法:

@Override
public boolean accept(Message<?> message) {
  Assert.notNull(message);
  Assert.isTrue(message.getHeaders().containsKey(TYPE_NAME));

  String historyType = (String)message.getHeaders().get(TYPE_NAME);
  JSONObject payload = (JSONObject) message.getPayload();
  String jsonString = payload.toJSONString();

  try {
      ProcessingReport report = schemaValidator.validate(historyType, payload);
      return report.isSuccess();
  } catch (IOException | ProcessingException e) {
      throw new MessagingException(message, e);
  }

}

我们所做的是在 catch 块中抛出一个 MessageException 似乎可以解决问题。然而,这似乎打破了过滤器应该做的事情(简单地返回一个真或假)。

是否有将错误详细信息从过滤器传递给客户端的最佳实践?过滤器是这个用例的正确解决方案吗?

谢谢你的帮助!约翰

4

2 回答 2

0

<service-activator/>...中进行验证可能更正确

public Message<?> validate(Message<?> message) {

    ...

    try {
        ProcessingReport report = schemaValidator.validate(historyType, payload);
        return message;
    } 
    catch (IOException | ProcessingException e) {
        throw new MessagingException(message, e);
    }
}

...因为你从来没有真正过滤过。

于 2015-06-10T21:52:52.283 回答
0

我会说你走正确的路。请参考XmlValidatingMessageSelector,所以你的JsonValidatingMessageSelector应该是相似的,并且必须遵循相同的设计。

由于我们有一个throwExceptionOnRejection选项,我们总是可以确定抛出异常而不是仅仅true/false是正确的行为。

Gary 说的也不错,但是根据该MessageSelectorimpl 中现有的逻辑,我们可以继续使用相同的方法并继续使用.filter(),但是,当然,已经没有 了.discardFlow(),因为我们不会向discardChannel.

准备好后,请JsonValidatingMessageSelector随时将其贡献回框架

于 2015-06-10T22:24:33.817 回答