我有一个带有一些字段的实体对象(名字,姓氏,城市等)。在一种情况下,我需要向该对象应用一组限制(非空,长度限制,唯一等),在其他情况下是其他集。目前我正在使用我自己的验证器,它对不同的用例有不同的验证方法。
我可以用另一种不同的方式进行验证(标准解决方案)吗?
我使用Spring和Hibernate。在Hibernate中实现的JSR303标准无法解决我的问题,因为注释只允许定义一组静态的限制。我无法在运行时重新定义它。
答案 0 :(得分:4)
您可以使用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();
答案 1 :(得分: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();)
}
我已经完成了这个,其中两个相关的类有一个列表。其中一个,列表至少需要两个元素。另一方面,列表可能是空的,或者至少需要两个元素。