验证器 Spring 集成

问题描述 投票:0回答:1

我正在尝试验证 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]

这是否是问题所在,因为我在将传入数据转换为文档之前尝试在流程中进行验证?

java spring-integration dsl xml-validation spring-integration-dsl
1个回答
1
投票

不,验证阶段是正确的,但显然 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;
                }
            })
© www.soinside.com 2019 - 2024. All rights reserved.