@Valid не работает, когда @RequestPart используется в Spring

При использовании @Valid аннотация @RequestPart не вызывает валидатор. В других местах я использовал @Valid с @RequestBody, и он отлично работает. Также нет ошибки, просто прохождение неправильной проверки.

Ниже приведен код.

@InitBinder("campaignCreatorDTO")
public void initCreatorDTOBinder(WebDataBinder binder) {

    binder.addValidators(new CreatorDTOValidator());
}

@PostMapping(value = "/creator", consumes = {"multipart/form-data"}, produces = {"application/json"})
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public @Valid
ResponseDTO creator(@Valid @RequestPart("json") CampaignCreatorDTO campaignCreatorDTO,
                    @RequestPart(name = "file", required = false) MultipartFile adGraphic) {
}

Вы переопределяете валидатор и привязываете его к атрибуту модели. Извлеките "campaignCreatorDTO" из @InitBinder и попробуйте еще раз. Если это не удается (потому что вы затем устанавливаете глобальный валидатор), попробуйте использовать имя аргумента json вместо имени аргумента модели.

M. Deinum 06.11.2018 13:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
2 163
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Запустите проверку в методе контроллера с помощью Validator Bean:

org.springframework.validation.Validator

@Autowired
protected Validator validator;

PostMapping(value = "/creator", consumes = {"multipart/form-data"}, produces = {"application/json"})
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public @Valid
ResponseDTO creator(@RequestPart("json") CampaignCreatorDTO campaignCreatorDTO,
                    @RequestPart(name = "file", required = false) MultipartFile adGraphic) {
    validator.validate(campaignCreatorDTO);
}

все еще не вызывает валидатор. та же проблема сохраняется.

Anjali 06.11.2018 12:49

Я уже пробовал приведенный выше код, и он не вызывает валидатор.

Anjali 06.11.2018 13:06

Просмотрите ссылку ниже: stackoverflow.com/questions/21329426/…, а также предоставьте более подробную информацию о creatorDTO и CampaignCreatorDTO.

Raheela Aslam 06.11.2018 13:09

@Anjali, посмотрите этот пост stackoverflow.com/questions/31175009/…, используйте этот импорт org.springframework.validation.Validator

Tara 06.11.2018 13:13
Ответ принят как подходящий

Как подробно описано в здесь, @InitBinder использует переданное ему значение для целевой проверки с такими же именованными параметрами запроса или атрибутами модели. Проблема в том, что у вас нет ни того, ни другого, поскольку вы используете ввод данных из нескольких частей в своей конкретной конечной точке /creator. Поэтому снятие ограничения именования с @InitBinder было бы решением.

@InitBinder
public void initCreatorDTOBinder(WebDataBinder binder) { ... }

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