【问题标题】:Annotation based validation messages are not displaying in Struts 2基于注释的验证消息未在 Struts 2 中显示
【发布时间】:2014-12-26 08:05:33
【问题描述】:

我在我的项目中使用基于 Struts 2 注释的验证。这是我的实体类,仅在此我验证了一些字段

public class Vendor implements Serializable {

 private String vendorName;

 public String getVendorName() {
    return vendorName;
}

@RequiredStringValidator(message = "VendorName is Required", type = ValidatorType.FIELD)
public void setVendorName(String vendorName) {
    this.vendorName = vendorName;
}

}

这是我实现模型驱动接口的动作类

public class AddVendorAction extends ActionSupport implements ModelDriven<Vendor> {

private Vendor v;

public AddVendorAction() {
    this.v = new Vendor();
}

public String save() {
    System.out.println("hhhhhhhhhWE");
    vd.addVendor(getV());

    return SUCCESS;
}

public String populateItems() {
    leftsideVendorlist = vd.itemSet();
    return SUCCESS;
}

public String vendorList() {
    vendorlist = vd.list();
    return SUCCESS;
}

public Vendor getV() {
    return v;
}

public void setV(Vendor v) {
    this.v = v;
}

public List<Vendor> getVendorlist() {
    return vendorlist;
}

public void setVendorlist(List<Vendor> vendorlist) {
    this.vendorlist = vendorlist;
}

@Override
public Vendor getModel() {
    return v;
}
}

这是我的 struts.xml 文件,它扩展了 hibernate-default 包

 <struts>
   <package name="purchasemodule" namespace="/" extends="hibernate-default">    
     <action name="AddVendor" class="com.elegant.purchasemodule.purchasemasters.vendor.AddVendorAction" 
        method="save">            
       <interceptor-ref name="defaultStack" />
        <result name="input" type="chain">populateitems</result>
        <result name="success" type="redirect">vendorlist</result>
    </action>
    <action name="vendorlist"  class="com.elegant.purchasemodule.purchasemasters.vendor.AddVendorAction" 
            method="vendorList">
        <result name="success">/VendorList.jsp</result>
    </action>
    <action name="populateitems" class="com.elegant.purchasemodule.purchasemasters.vendor.AddVendorAction" 
            method="populateItems">
        <result name="success">/addvendor.jsp</result>  
        <result name="input" >/addvendor.jsp</result>
    </action>
  </package> 
</struts>

这是我的jsp页面

<form  action="AddVendor" method="post" class="form-horizontal" >
    <label class="col-md-3 control-label" for="textinput">Vendor Name</label>  
        <s:textfield name="vendorName" cssClass="form-control input-md"></s:textfield>
        </form>

它没有显示任何验证消息。我无法找出问题所在。任何人都可以帮助我。

【问题讨论】:

    标签: java hibernate jsp validation struts2


    【解决方案1】:

    您应该在 model 属性上使用访问者字段验证器

    @Override
    @VisitorFieldValidator(appendPrefix = false)
    public Vendor getModel() {
        return v;
    }
    

    【讨论】:

    • 因为input结果不应该是chain它应该是dispatcher,如果你想填充列表在prepare()方法中通过实现Prepareable或配置input()方法.
    • 非常感谢它对我帮助很大。
    • 谢谢你,我已经看到了。在上面的 jsp 页面中,错误消息显示了两次,我不知道为什么。你能通过查看代码再次帮助我吗?提前非常感谢你 SO 中的帮助很棒。
    • 如果您使用默认 (xhtml) 主题,则无需使用s:fielderror 标签,xhtml 主题添加错误消息,s:fielderror 也添加消息。
    • 我尝试使用简单的主题。s:fielderror 也显示了两次消息。
    【解决方案2】:

    根据@Roman C 给出的建议。这样的更改是否有效。在我的动作类中添加了@VisitorFieldValidator(appendPrefix = false)

    public class AddVendorAction extends ActionSupport implements ModelDriven<Vendor>,Preparable {
     @Override
    @VisitorFieldValidator(appendPrefix = false)
    public Vendor getModel() {
        return v;
    } 
    @Override
    public void prepare() throws Exception {
         leftsideVendorlist = vd.itemSet();
    }
    }
    

    在 Struts.xml 文件中添加defaultStack

    <action name="AddVendor" 
                class="com.elegant.purchasemodule.purchasemasters.vendor.AddVendorAction" 
                method="save">            
            <interceptor-ref name="defaultStack"/>
            <result name="input">/addvendor.jsp</result>
            <result name="success" type="redirect">vendorlist</result>
        </action>
    

    在Jsp页面中添加&lt;s:error标签和对应的字段名

    <s:form  action="AddVendor" method="post" cssClass="form-horizontal" theme="simple">
    
     <label class="col-md-3 control-label" for="textinput">Vendor Name</label>  
     <s:textfield id="vendorName" name="vendorName" cssClass="form-control input-md"/> 
     <s:fielderror fieldName="vendorName" cssClass="alert-danger"/>
     </s:form>
    

    【讨论】:

    • 但是在上面的代码验证错误消息显示两次,无法弄清楚为什么。谁能帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多