Spring 集成并返回架构验证错误
Spring Integration and returning schema validation errors
我们正在使用 Spring 集成来处理传递到 RESTful 端点的 JSON 有效载荷。作为此流程的一部分,我们使用过滤器来验证 JSON:
.filter(schemaValidationFilter, s -> s
.discardFlow(f -> f
.handle(message -> {
throw new SchemaValidationException(message);
}))
)
效果很好。但是,如果验证失败,我们希望捕获解析错误并将其 return 提供给用户,以便他们可以对错误采取行动。这是 SchemaValidationFilter class:
中重写的 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,这似乎解决了问题。然而,这似乎打破了过滤器应该做的事情(简单地 return 真或假)。
是否有将错误详细信息从过滤器传递到客户端的最佳实践?过滤器是这个用例的正确解决方案吗?
感谢您的帮助!
约翰
在 <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
选项,我们总是可以确定抛出异常而不只是 true/false
是正确的行为。
Gary 说的也不错,但是按照MessageSelector
impl 的现有逻辑,我们可以照样继续使用.filter()
,但是,当然,已经没有 .discardFlow()
,因为我们不会向 discardChannel
.
发送无效消息
当您的 JsonValidatingMessageSelector
准备就绪后,请随时将其回馈给 Framework!
我们正在使用 Spring 集成来处理传递到 RESTful 端点的 JSON 有效载荷。作为此流程的一部分,我们使用过滤器来验证 JSON:
.filter(schemaValidationFilter, s -> s
.discardFlow(f -> f
.handle(message -> {
throw new SchemaValidationException(message);
}))
)
效果很好。但是,如果验证失败,我们希望捕获解析错误并将其 return 提供给用户,以便他们可以对错误采取行动。这是 SchemaValidationFilter class:
中重写的 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,这似乎解决了问题。然而,这似乎打破了过滤器应该做的事情(简单地 return 真或假)。
是否有将错误详细信息从过滤器传递到客户端的最佳实践?过滤器是这个用例的正确解决方案吗?
感谢您的帮助! 约翰
在 <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
选项,我们总是可以确定抛出异常而不只是 true/false
是正确的行为。
Gary 说的也不错,但是按照MessageSelector
impl 的现有逻辑,我们可以照样继续使用.filter()
,但是,当然,已经没有 .discardFlow()
,因为我们不会向 discardChannel
.
当您的 JsonValidatingMessageSelector
准备就绪后,请随时将其回馈给 Framework!