【问题标题】:Custom validator does not set parameter values to the properties of the validator in Struts2自定义验证器不会将参数值设置为 Struts2 中验证器的属性
【发布时间】:2014-02-24 13:15:51
【问题描述】:

我正在尝试在 Struts2 (2.3.16) 中构建一个自定义验证器,如下所示。

package validator;

import actions.DiscountAction;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.ValidatorSupport;
import org.joda.time.DateTime;

public final class DiscountDateValidator extends ValidatorSupport
{
    private DateTime startDate;
    private DateTime endDate;

    //Getters and setters.

    @Override
    public void validate(Object o) throws ValidationException
    {
        System.out.println("startDate = "+startDate);
        System.out.println("endDate = "+endDate);
        System.out.println((o instanceof DiscountAction));
    }
}

validators.xml 文件如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Config 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd">

<validators>
    <validator name="discountDateValidator" 
               class="validator.DiscountDateValidator"/>
</validators>

这个验证器被用在一个动作中,如下所示。

@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value="struts-default")
public final class DiscountAction extends ActionSupport implements Serializable, ValidationAware, ModelDriven<Discount>
{
    @Autowired
    private final transient DiscountService discountService=null;
    private static final long serialVersionUID = 1L;

    private Discount entity=new Discount();

    @Override
    public Discount getModel() {
        return entity;
    }

    @Validations(
        customValidators={
            @CustomValidator(type="discountDateValidator", parameters={
                @ValidationParameter(name="startDate", value="${entity.discountStartDate}"), 
                @ValidationParameter(name="endDate", value="${entity.discountEndDate}")}, 
            message="xxx zzz aaa")})
    @Action(value = "AddDiscount",
    results = {
        @Result(name=ActionSupport.SUCCESS, type="redirectAction", params={"namespace", "/admin_side", "actionName", "Discount", "currentPage", "${currentPage}", "message", "${message}", "editId", "${editId}", "status", "${status}"}),
        @Result(name = ActionSupport.INPUT, location = "Discount.jsp")},
    interceptorRefs={@InterceptorRef(value="defaultStack", params={"params.acceptParamNames", "editId, discountId, discountCode, discountPercent, discountStartDate, discountEndDate, currentPage, rowCount, totalPages, status", "validation.validateAnnotatedMethodOnly", "true"})})
    public String insert(){
        return ActionSupport.SUCCESS;
    }
}

DiscountDateValidatorvalidate() 方法在提交表单时被调用,但 startDateendDate 的值始终为 nullo instanceof DiscountAction 的计算结果为 true

我在这里俯瞰什么?

【问题讨论】:

    标签: java validation struts2


    【解决方案1】:

    这是因为${discountStartDate}${discountEndDate}@ValidationParameter的值属性)直接设置为验证器的字符串属性,我们需要在validate()方法中使用Object parse(String expression, Class type)方法手动解析.

    parse() 方法将此类表达式计算为 OGNL 表达式。这些改动后的验证器如下。

    package validator;
    
    import actions.DiscountAction;
    import com.opensymphony.xwork2.validator.ValidationException;
    import com.opensymphony.xwork2.validator.validators.ValidatorSupport;
    import org.joda.time.DateTime;
    
    public final class DiscountDateValidator extends ValidatorSupport
    {
        private String startDate; //Set to ${discountStartDate}
        private String endDate;   //Set to ${discountEndDate}
    
        public String getStartDate() {
            return startDate;
        }
    
        public void setStartDate(String startDate) {
            this.startDate = startDate;
        }
    
        public String getEndDate() {
            return endDate;
        }
    
        public void setEndDate(String endDate) {
            this.endDate = endDate;
        }
    
        @Override
        public void validate(Object o) throws ValidationException
        {
            DateTime discountStartDate = (DateTime)parse(startDate, DateTime.class);
            DateTime discountEndDate = (DateTime)parse(endDate, DateTime.class);
    
            System.out.println("startDate = "+discountStartDate);
            System.out.println("endDate = "+discountEndDate);
            System.out.println((o instanceof DiscountAction));
    
            //Perform validation as required using these values.
        }
    }
    

    getFieldValue("discountStartDate", o)getFieldValue("discountEndDate", o) 也可以直接检索字段值(我不确定这种方法在此类验证器中的任何副作用)。

    ${entity.discountStartDate}${entity.discountStartDate} 不是必需的(entity 应被排除,因为它包含在问题中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多