繁体   English   中英

Spring Integration和返回架构验证错误

[英]Spring Integration and returning schema validation errors

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

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

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

@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,这似乎可以解决问题。 但是,这似乎破坏了过滤器应该执行的操作(仅返回true或false)。

是否存在将错误详细信息从过滤器传递到客户端的最佳实践? 过滤器是否适合此用例?

谢谢你的帮助! 约翰

<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);
    }
}

...因为您从未真正过滤过。

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

因为我们有throwExceptionOnRejection选项,所以我们始终可以确保抛出Exception而不是true/false是正确的行为。

Gary所说的也很好,但是根据MessageSelector impl中的现有逻辑,我们可以继续使用.filter()并继续使用.filter() ,但是,当然已经没有.discardFlow() ,因为我们不会t将无效消息发送到discardChannel

当您的JsonValidatingMessageSelector准备就绪时,请随时将其贡献回Framework

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM