Я пытаюсь проверить входящие данные 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;
}
})
Спасибо, только что понял, что проблема была в idd с преобразованием массива байтов в Document. @Артем Билан