我正在尝试验证 Spring 集成中传入的 xml 数据。我已经使用了验证器并实现了它的方法。但是当我运行应用程序时,我发现该类不受支持。 这是我在验证器类中的代码:
@Override
public boolean supports(Class<?> clazz) {
return Document.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
try {
classUtil.validateDocument((Document) target, someResult);
} catch (Exception exc) {
errors.reject(error);
}
}
这是我的集成流程:
return IntegrationFlows.from(
Http.inboundGateway("/foo")
.requestMapping(m -> m.methods(HttpMethod.POST)
.consumes("application/xml")
)
.validator(new Validator())
)
.transform(new ByteArrayToDocumentClass())
.transform(Transformers.objectToString())
.enrichHeaders(h -> h.headerExpression(h, path))
.get();
我遇到的错误是:
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.messaging.converter.MessageConversionException: Cannot create request message; nested exception is java.lang.IllegalArgumentException: Validator [class com.example.Validator] does not support [class [B]] with root cause
java.lang.IllegalArgumentException: Validator [class com.example.Validator] does not support [class [B]
这是否是问题所在,因为我在将传入数据转换为文档之前尝试在流程中进行验证?
不,验证阶段是正确的,但显然 HTTP 请求的正文没有转换为那个
Document
。看起来身体还是呈现为byte[]
。
我看到您有一个类似
ByteArrayToDocumentClass
下游的逻辑,它已经在 HTTP 入站端点之后。所以,也许您的想法有点不同,您确实希望在此之后验证该文档.transform(new ByteArrayToDocumentClass())
。为此,我建议编写一些简单的服务激活器以便能够调用验证器:
.handle((payload, headers) -> {
BeanPropertyBindingResult errors = new BeanPropertyBindingResult(payload, "requestPayload");
ValidationUtils.invokeValidator(validator, payload, errors);
if (errors.hasErrors()) {
throw new IllegalStateException(errors.toString());
}
else {
return payload;
}
})