验证器 Spring 集成

Validator Spring integration

我正在尝试验证 spring 集成中的传入 xml 数据。我已经使用了 Validator 并实现了它的方法。但是当我是 运行 应用程序时,我发现 class 不受支持。 这是我在验证器中的代码 class:

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