Интеграция с валидатором 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]

это проблема, потому что я пытаюсь проверить в своем потоке перед преобразованием входящих данных в документ?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
44
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;
                }
            })

Спасибо, только что понял, что проблема была в idd с преобразованием массива байтов в Document. @Артем Билан

carlowws 23.03.2022 08:54

Другие вопросы по теме