验证不能通过添加新注释来修改的类

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

模型是通过一些工具生成的。特定字段通过@NotNull 注释进行注释。我无法修改生成的类。我需要对生成的类进行附加验证,例如检查字符串字段的值是否不包含空字符串,然后抛出 ConstraintViolationException。目前,我迭代该类以查找 String 的字段类型,然后在空字符串的情况下,我需要实现自己的 ConstraintViolation 接口,这是非常困难的。所以它看起来像这样:

    Validator validator = Validation.buildDefaultValidatorFactory()
            .getValidator();
    Set< ConstraintViolation< E > > validationErrors = validator.validate(aEntity);
    Field[] fields = aEntity.getClass().getDeclaredFields();
    for (Field f : fields) {
        Class<?> type = f.getType();
        if (type == String.class) {
            try {
                String v = (String) f.get(aEntity);
                // check that value is not an empty string
                if (v == null || !v.trim().isEmpty()) {
                    validationErrors.add(new ConstraintViolation<E>() {
                        @Override
                        public String getMessage() {
                            return null;
                        }

                        @Override
                        public String getMessageTemplate() {
                            return null;
                        }

                        @Override
                        public E getRootBean() {
                            return null;
                        }

                        @Override
                        public Class<E> getRootBeanClass() {
                            return null;
                        }

                        @Override
                        public Object getLeafBean() {
                            return null;
                        }

                        @Override
                        public Object[] getExecutableParameters() {
                            return new Object[0];
                        }

                        @Override
                        public Object getExecutableReturnValue() {
                            return null;
                        }

                        @Override
                        public Path getPropertyPath() {
                            return null;
                        }

                        @Override
                        public Object getInvalidValue() {
                            return null;
                        }

                        @Override
                        public ConstraintDescriptor<?> getConstraintDescriptor() {
                            return null;
                        }

                        @Override
                        public <U> U unwrap(Class<U> type) {
                            return null;
                        }
                    });
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
    }

是否可以让这变得更容易?

java hibernate hibernate-validator jakarta-validation
1个回答
0
投票

对于无法编辑类以向其添加验证注释的情况,有两种选择:

通过 XML 指定约束

要使用这种方法,您需要添加一个

META-INF/validation.xml
,然后在其中您可以定义/重新定义您的约束:

<?xml version="1.0" encoding="UTF-8"?>
<constraint-mappings
    xmlns="https://jakarta.ee/xml/ns/validation/mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        https://jakarta.ee/xml/ns/validation/mapping
        https://jakarta.ee/xml/ns/validation/validation-mapping-3.0.xsd"
    version="3.0">

    <!-- note that you can use ignore-annotations 
        to either ignore any annotation constraints 
        or include them, depending on your needs -->
    <bean class="com.acme.common.model.SomeType" ignore-annotations="false">
       <field name="someField">
           <constraint annotation="jakarta.validation.constraints.NotBlank"/>
           [...]
       </field>
       [...]
    </bean>
</constraint-mappings>

有关更多详细信息,您应该检查规范的这一部分

编程约束定义

或者,Hibernate Validator 提供了一种以编程方式添加约束的方法:

HibernateValidatorConfiguration configuration = Validation
        .byProvider( HibernateValidator.class )
        .configure();

ConstraintMapping constraintMapping = configuration.createConstraintMapping();

constraintMapping
    .type( Car.class )
        .field( "manufacturer" )
            .constraint( new NotNullDef() )
        .field( "licensePlate" )
            .ignoreAnnotations( true )
            .constraint( new NotNullDef() )
            .constraint( new SizeDef().min( 2 ).max( 14 ) )
    .type( RentalCar.class )
        .getter( "rentalStation" )
            .constraint( new NotNullDef() );

Validator validator = configuration.addMapping( constraintMapping )
        .buildValidatorFactory()
        .getValidator();

有关更多详细信息,请查看 Hibernate Validator 文档的部分

如果您不知道哪些字段不需要应用空/空白约束,您可以尝试使用反射迭代字段,然后根据该信息通过编程 API 定义约束。将约束添加到验证器后,您应该能够使用

Validator#validate(..)

© www.soinside.com 2019 - 2024. All rights reserved.