Почему проверка не работает на объектах типа DTO, а только на объектах - PullRequest
0 голосов
/ 11 октября 2019

У меня есть аннотация, установленная для объектов типа dto , так же, как для объектов типа Entity . Аннотация работает с сущностями , но не с объектами типа dto .

Я работаю в SpringBoot . application.properties

validate.packageid.size = "The field 'PACKAGEID' can contain only {max} symbols.";

файл конфигурации

@Configuration
public class ServiceConfig implements WebMvcConfigurer {

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource source = new ResourceBundleMessageSource();
        source.setDefaultEncoding("UTF-8");
        source.setBasename("classpath:ValidationMessages");
        return source;
    }

    @Nullable
    @Override
    public Validator getValidator() {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource());
        return validator;
    }

}

dto

@Size(message = "{validate.packageid.size}", max = 36)
private String documentId

сущность

@Column(name = "DOCUMENTID")
@Size(message = "{validate.packageid.size}", max = 36)
private String documentId;

Я не могу использовать аннотацию @ Действительный , поскольку я заполняю объект типа dto с помощью технологии отражения.

public static  <S> S fillData (S object, List<Object> values){
    return obtainMetadataOfObject(object, values);
}

Мне нужно иметь возможность получить аннотацию ограничения, или, скорее, его параметры, заданную в полях объекта dto (но в случае объекта dto я получаю значение null, поскольку Spring может не знать, чтоиспользовать аннотации ограничений, заданные для полей объекта dto), в случае объекта - получается, но Spritg задействует средство проверки объекта, поскольку оно управляет объектом как компонентом из контекста приложения.

Чтобы проверить dto на стороне веб-клиента, я использую аннотацию @ Valid в параметрах метода, обрабатывающего запрос от клиента

Для проверки dto из

Обновление

Я поставил анотуion @ Validation over dto и после этого я получил необходимые данные.

Это работает для классов, у которых нет наследника классов.

Я получаю данные аннотации @ Size

    private static int getMaxLimitSize(Field field){

            field.setAccessible(true);

            Size annotation = field.getAnnotation(Size.class);

            int zero = 0;

            if(annotation == null) return zero;

            return annotation.max();

        }

Но это не работает для объектов, поля которых разбиты на несколько классов: несколько абстрактных и один.

Проверка не работает для составных объектов типа DTO , Любая помощь приветствуется?

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Проверка должна быть запущена где-то, для сущностей в вашем случае это делает Spring Framework (или, возможно, jpa). DTO никогда не делают это там. Таким образом, вы должны запустить проверку (validator.validate) самостоятельно, согласно документации . Вот связанный вопрос , спрашивающий, на каком прикладном уровне это сделать.

0 голосов
/ 11 октября 2019
 @PostMapping("/test")
    public void test( @RequestBody @Valid final UserDto dto) {

        // logic
    }

Вы должны добавить аннотацию @Valid в контроллере. Если вы хотите проверить dto в служебных слоях, вы должны добавить @Validate и @Valid:

@Service
@Validated
public class Service {

   public void test(@Valid UserDto dto){
       // logic
   }
}
...