【问题标题】:When is actually a custom validator needed in Struts2?Struts2 什么时候需要自定义验证器?
【发布时间】: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


【解决方案1】:

在以下情况下使用自定义验证器:

  • 您想使用基于注释或基于 XML 的验证
  • 您希望在许多操作中重复使用相同的验证,但需要注意的是...
  • ...如果验证已经存在于外部逻辑中(无论如何它应该存在),您也可以在 validate 方法中重新使用它

自定义验证器的业务逻辑应该已经作为一个单独的实体存在。它应该作为嵌入在动作中的代码存在;它使操作和验证都更难测试。

当逻辑位于适当的位置时,很容易在任一验证器validate方法中使用。优点是易于在 XML 和/或注释中重用。

【讨论】:

    【解决方案2】:

    在这样的point-of-view 中,我也可以声称不需要 Struts2,因为我可以使用 C++ 实现我的 Web 应用程序。你能接受吗?我认为不会,因为使用像 Struts2 这样的 MVC 模式会使您的应用程序更加干净和可维护。此外,当它们已经实现时,您不必自己重做。

    同样,如果您想使用已经实施和测试过的最佳实践,并且如果您想通过不从头开始做事来节省时间和金钱,并且如果您喜欢使用可维护的代码分离的关注点 ...那么您需要使用Struts2 custom validators 而不是那个丑陋的validate 方法(这很丑陋,因为aspects 这样的验证不应该与业务逻辑混合 - 请参阅AOP)。

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多