Spring集成并返回模式验证错误

时间:2015-06-10 21:00:14

标签: spring spring-integration json-schema-validator

我们正在使用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)。

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

感谢您的帮助! 约翰

2 个答案:

答案 0 :(得分: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);
    }
}

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

答案 1 :(得分:0)

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

由于我们有throwExceptionOnRejection选项,因此我们始终可以确保抛出异常而非true/false是正确的行为。

Gary说的也很好,但根据MessageSelector impl中的现有逻辑,我们可以继续使用.filter()并继续使用.discardFlow(),但当然,已经没有discardChannel {1}},因为我们不会向JsonValidatingMessageSelector发送无效邮件。

当您的hosebirdClient.connect()准备就绪后,请随时将其回馈给Framework