【发布时间】:2014-01-29 23:23:52
【问题描述】:
我们的操作类中有直接可用的validate() 方法,我们可以在其中放置自己的逻辑来执行我们需要的某种验证。
例如,如果我需要验证有关日期时间的两个字段,我可以将自己的逻辑放入 validate() 方法中,如下所示。
public final class DiscountAction extends ActionSupport implements ValidationAware, ModelDriven<Discount>
{
private Discount entity=new Discount();
@Override
public Discount getModel() {
return entity;
}
@Override
public void validate()
{
if(entity.getDiscountStartDate()!=null&&entity.getDiscountEndDate()!=null)
{
final int period=30;
final DateTime startDate=entity.getDiscountStartDate().withZone(DateTimeZone.forID("Asia/Kolkata")).withMillisOfSecond(0);
final DateTime endDate=entity.getDiscountEndDate().withZone(DateTimeZone.forID("Asia/Kolkata")).withMillisOfSecond(0);
final DateTime currentDate=new DateTime(DateTimeZone.forID("Asia/Kolkata"));
final int daysBetween = Days.daysBetween(startDate, endDate).getDays();
if(startDate.isAfter(endDate))
{
addFieldError("discountStartDate", "The start date must be earlier than the end date.");
}
else if(startDate.equals(endDate))
{
addFieldError("discountEndDate", "Both the dates can not be same.");
}
else if(DateTimeComparator.getDateOnlyInstance().compare(currentDate, endDate)==0 || endDate.isBefore(currentDate))
{
addFieldError("discountEndDate", "Can not be today's date or any day before today.");
}
else if(Days.daysBetween(startDate, endDate).getDays()<1)
{
addFieldError("discountEndDate", "There must be an interval of at least one day.");
}
else if(daysBetween>period)
{
addFieldError("discountEndDate", "The discount period is valid only upto "+period+(period==1?" day":" days")+" period which it excceds. The actual difference is "+daysBetween);
}
}
}
}
假设entity 是模型类的一个实例。
为什么我们需要自定义验证器?我还没有尝试过自定义验证器,因为它还不需要。
您能否向我展示一个真正需要自定义验证器的真实情况/示例?
【问题讨论】:
-
我强烈反对使用
validate方法,如果您真的想验证您的实体或数据,请使用内置的 Struts2 验证器框架或使用其他更强大和灵活的插件,如 Struts2-JSR303 -
如果您需要在不同的动作类中进行此验证,那么自定义验证器是完美的解决方案。
-
真正需要自定义验证器的真实情况。见stackoverflow.com/q/20835110/573032
标签: java validation struts2