2

我有一个包含一些字段(名字、姓氏、城市等)的实体对象。在一种情况下,我需要对这个对象应用一组限制(非空、长度限制、唯一等),在另一种情况下是其他一组。目前我正在使用自己的验证器,它针对不同的用例有不同的验证方法。

我可以用另一种不同的方式(标准解决方案)执行验证吗?

我将 Spring 与 Hibernate 一起使用。在 Hibernate 中实现的 JSR303 标准无法解决我的问题,因为注释只允许定义一组静态限制。我无法在运行时重新定义它。

4

2 回答 2

5

您可以使用 Hibernate Validator 通过 ConstraintMapping 以编程方式构造约束:http: //docs.jboss.org/hibernate/validator/4.1/api/org/hibernate/validator/cfg/ConstraintMapping.html。可以找到文档http://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/programmaticapi.html

ConstraintMapping mapping = new ConstraintMapping();
mapping.type( Car.class )
    .property( "manufacturer", FIELD )
        .constraint( NotNullDef.class )
    .property( "licensePlate", FIELD )
        .constraint( NotNullDef.class )
        .constraint( SizeDef.class )
            .min( 2 )
            .max( 14 )
    .property( "seatCount", FIELD )
        .constraint( MinDef.class )
            .value ( 2 )
.type( RentalCar.class )
    .property( "rentalStation", METHOD)
        .constraint( NotNullDef.class );
HibernateValidatorConfiguration config = Validation.byProvider( HibernateValidator.class ).configure();
config.addMapping( mapping );
ValidatorFactory factory = config.buildValidatorFactory();
Validator validator = factory.getValidator();
于 2013-04-16T14:07:25.930 回答
1

您可以在部署时使用类路径根目录下的validation.xml文件重新定义 Hibernate 验证器。如果任何一种部署只需要一种验证方案,那将起作用;您可以使用自己的 xml 文件构建每个部署。

另一方面,如果所需的验证依赖于应用程序的状态,那么您需要依赖于状态的验证器。验证组不会帮助你。您能否使用不同但相关的实体对象:

abstract class BaseEntity {
    private String name;
    public String getName() { return name;}
}

public class Entity1 extends BaseEntity {
    @Override
    @NotNull
    @Length(min=2, max=20)
    public String getName() { return super.getName();)
}

public class Entity2 extends BaseEntity {
    @Override
    @Length(min=2, max=10)
    public String getName() { return super.getName();)
}

我已经这样做了,其中两个相关的类有一个列表。一方面,该列表至少需要两个元素。另一方面,列表可能为空,或者至少需要两个元素。

于 2013-04-16T13:50:11.827 回答