调用方法添加报错信息: 
public void savePubBroker(DealerPubBroker dealerPubBroker) { 
Integer brokerId=dealerPubBroker.getBrokerId(); 
//brokerId为空代表是新增 否则为修改 
if(brokerId==null){ 
ResultInfo<DealerPubBroker> resultInfo=pubBrokerDAO.findBrokerByCpid(dealerPubBroker.getCpId()); 
if(resultInfo.getResultList().size()==0){ 
if(dealerPubBroker.getLoginMode()==null){ 
throw new AppException("请选择至少一种客户标识类型!"); 
}else{ 
pubBrokerDAO.save(dealerPubBroker); 

}else{ 
throw new AppException("该券商代码已使用,请重新定义!"); 

}else{ 
try{ 
pubBrokerDAO.save(dealerPubBroker); 
}catch(Exception e){ 
throw new AppException("操作失败!"); 

} } action 中添加错误信息: 
try{ 
pubBrokerServ.savePubBroker(dealerPubBroker); 
}catch(AppException ae){ 
if(typeCode==null&&loginMode==null){ 
addFieldError("noTypeCode", ae.getMessage()); 
}else{ 
addFieldError("isUsed", ae.getMessage()); 

dois="add"; 
typeCode=null; 
return "showAddBroker"; 

得到报错页面后: 
再次提交后却不调用action了 
当把action中的addFieldError("noTypeCode", ae.getMessage());注释掉 之后却可以二次提交,也调用了后台action 
try{}catch(Exception e){}不到任何信息。这是为什么?我觉得是addFieldError 的问题。希望能有好心人帮忙指点,问题出在哪,在此感激各位!! 

解决方案 »

  1.   

    验证的方法在action里应该放在 validate 方法下:如:public class LoginAction extends ActionSupport { private String name;
    private String password;
    private String rePassword;
    private String age;
    private Date date;
    private String email; public String getName() {
    return name;
    } public String getEmail() {
    return email;
    } public void setEmail(String email) {
    this.email = email;
    } public void setName(String name) {
    this.name = name;
    } public String getPassword() {
    return password;
    } public void setPassword(String password) {
    this.password = password;
    } public String getAge() {
    return age;
    } public void setAge(String age) {
    this.age = age;
    } public Date getDate() {
    return date;
    } public void setDate(Date date) {
    this.date = date;
    } @Override
    public void validate() {
    if (name.equals("") || name == null) {
    this.addFieldError("name", "姓名不能为空!");
    } else if (!name.matches("[[a-z]|[A-Z]]*")) {
    this.addFieldError("name", "姓名只能字母!");
    }
    if (!age.matches("\\d+")) {
    this.addFieldError("age", "年龄必须为数字!");
    } else if (Integer.valueOf(age) < 1 || Integer.valueOf(age) > 150) {
    this.addFieldError("age", "年龄不符合规范!");
    }
    if (password.matches("") || password == null) {
    this.addFieldError("password", "密码不能为空!");
    } else if (!rePassword.matches(password)) {
    this.addFieldError("rePassword", "两次输入的密码不同!");
    }
    if (!email
    .matches("^([0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*@(([0-9a-zA-Z])+([-\\w]*[0-9a-zA-Z])*\\.)+[a-zA-Z]{2,9})$")) {
    this.addFieldError("email", "邮箱必须符合规范!");
    } } public String execute() { if (name.equals("123") && password.equals("123")
    && rePassword.equals(password)) {
    return SUCCESS; } else {
    return INPUT;
    } } public String getRePassword() {
    return rePassword;
    } public void setRePassword(String rePassword) {
    this.rePassword = rePassword;
    }
    }
    看这个例子,验证都是放在action下的validate 方法
      

  2.   


    this.addFieldError 放在 validate() 下使用,其他方法下,不要使用
      

  3.   

    在其他的方法下面添加addFieldError 为什么不能用?我是接手这个项目做的,里面原来的模块里面报错信息都是用这种方式添加然后前端jsp用<s:fielderror><s:param>noTypeCode</s:param></s:fielderror>做显示,都没什么问题,而我做的时候仿照他里面的做法却有问题,为什么注释//addFieldError 之后就没问题了。
      

  4.   

    补充:而且在jsp中得到错误信息之后,在次提交,就退出了系统转向到了登陆页面,在地址栏上点击也不可返回,重新登陆之后原来对应的导航标签不能用,一点击就转向到了登陆页面,其他导航标签却没有问题。能正常使用。这是不是跟缓存或者权限什么的有关呢?我实在搞头不清了。
      

  5.   

    如果是继承ActionSupport 并使用默认拦截器栈。
    那么
    addFieldError如果在validate()里被执行,
    则会跳过execuate()直接转向INPUT 结果。你仔细看下struts2 的源码就明白了。
      

  6.   

    我使用的是继承ActionSupport 并使用默认拦截器栈。  但是addFieldError 不是在validate()里面被执行的,是在调用的某个方法里面 比如 public String addSite(){ ......}在这里做添加另外我还想问一下:
    有没有其他方法把后端的验证错误信息提示道前端来,像.net可以直接alert 出来的那种?
      

  7.   

    楼主我也遇到了和你一样的问题,
    我建议 你换一种方式吧。
    在Action里面用字段封装错误信息,
    然后在界面用EL表达式 或者是<s:property />的方式显示都可以
    我和你一样的 之前用Struts2+Hibernate做的时候使用addFielderror()一点问题也没有
    后来加上 Spring就出现这样的问题了!