EasyJWeb的验证系统的Bug及使用心得

原创 2007年10月12日 09:28:00

 
   今天使用EasyJWeb的“人性化”验证功能,发现了存在不少Bug,这里发出来并与大家分享。

    我们系统中的User基类的内容如下:

 

@Entity
@Cache(usage 
= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@javax.persistence.Table(name 
= "UserInfo")
@Inheritance(strategy 
= InheritanceType.JOINED)
@FormPO(inject 
= "name,email,password,problem,solution")
public abstract class User implements Principal, UserDetails ...{

 
private static final long serialVersionUID = 2915030721449148555L;

 @Id
 @GeneratedValue(strategy 
= GenerationType.TABLE)
 
private Long id;

 @Column(length 
= 30, unique = true)
 @Field(validator 
= @Validator(name = "string", value = "blank;trim;max:30", required = true))
 
private String name;

 @Column(length 
= 100)
 @Field(validator 
= @Validator(name = "email", required = true, value = "max:100"))
 
private String email;

 @Column(length 
= 64)
 @Field(validator 
= @Validator(name = "string", value = "blank;trim;max:64", required = true))
 
private String password;

 
private Date registerTime;

 
private Integer status = 1;// -1锁定、0未审核、1通过

 
private Integer loginTimes;

 
private Date lastLoginTime = new Date();

 
private String lastLoginIP;

 
private String problem; // 密码提问

 
private String solution; // 答案

 
private Long imUin;

 @ManyToMany(mappedBy 
= "users", cascade = CascadeType.ALL)
 @JoinTable(name 
= "User_Roles")
 
private List<Role> roles = new java.util.ArrayList<Role>();

 @ManyToMany(cascade 
= CascadeType.ALL)
 @JoinTable(name 
= "User_Permissions")
 
private List<Permission> permissions = new java.util.ArrayList<Permission>();

 @Transient
 
private GrantedAuthority[] authorities;

 ...

}


 

下面是一个User的子类,PersonalUser的内容如下:

 

@FormPO(label="个人用户信息",disInject="score,activeCode")
@Entity
@Cache(usage 
= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class PersonalUser extends User ...{
 
/** *//**
  * 积分
  
*/

 
private Integer score;

 
/** *//**
  * 真实姓名
  
*/

 @Field(name
="真实姓名", validators = ...{ @Validator(name = "string", value = "msg:请填写您的真实姓名。;blank;min:2;max:10", required = true) })
 @Column(length 
= 20)
 
private String trueName;

 
/** *//**
  * 身份证号
  
*/

 @Field(name
="身份证号", validators = ...{ @Validator(name="regex",value="msg:请填写有效的证件号码。;expression:/d{15}|/d{17}[/dXx]", required = true) })
 @Column(length 
= 20)
 
private String identifyCard;

 
/** *//**
  * 电话
  
*/

 @Field(name
="电话", validators = ...{ @Validator(name = "required", value = "msg:您填写的身份证号码有误,请检查后重新提交。;blank;min:7;max:15", required = true) })
 @Column(length 
= 20)
 
private String tel;

 
/** *//**
  * 手机
  
*/

 @Field(name
="手机", validators = ...{ @Validator(name = "regex", value = "expression:/d{11}", required = true) })
 @Column(length 
= 25)
 
private String mobile;

..
}


 

下面是个人用户注册保存时的源代码:

 

/** *//**
  * 保存个人注册信息
  * 
  * 
@param form
  * 
@return
  
*/

 
public Page savePersonal(WebForm form) ...{  
  PersonalUser user 
= form.toPo(PersonalUser.class);
  
if(hasErrors())return page("registerStep3Personal");//跳回注册页面
  
//执行注册操作
  this.userService.addPersonalUser(user);
  
return page("success");
 }



    执行这个程序,针对name及password等属性的验证能正常工作。但PersonalUser中针对电话号码、身份证等属性无论如何都不能正常执行验证功能,真是郁闷啊。后来仔细发现,不但没有执行验证,尽然连值也没有传入到持久层中。因此,应该是不允许注入这些属性值的问题所允许的。于是跟踪了一下源代码,在com.easyjf.web.core.FormHandler中发现如下的内容:

 

public boolean checkFormPOWriteEnabled(Class clz,
            java.beans.PropertyDescriptor property) 
...{
        
boolean ret = true;
        FormPO formPO 
= (FormPO) clz.getAnnotation(FormPO.class);
        
boolean haveFound = false;
        
if (formPO != null...{
            String injectEnabled 
= formPO.inject();
            
            
if (StringUtils.hasLength(injectEnabled)) ...{
                ret 
= ("," + injectEnabled + ",").indexOf(","
                        
+ property.getName() + ",">= 0;// 找不到,则不注入
                if (ret)
                    haveFound 
= true;
            }
 else ...{
                String disInject 
= formPO.disInject();                
                
if (StringUtils.hasLength(disInject))
                    ret 
= ("," + disInject + ",").indexOf(","
                            
+ property.getName() + ","< 0;// 找到,则不注入
                if (!ret)
                    haveFound 
= true;
            }
        
        }

        
if (!haveFound && clz.getSuperclass() != Object.class)
            ret 
= checkFormPOWriteEnabled(clz.getSuperclass(), property);
        
return ret;
    }


   

     这个方法写得比较有意思,几行代码转了几个弯,真考验人的逻辑思维啊。他是在检查@FormPO标签中的inject或disInject属性情况。在子类中若找不到标签属性,还会到父类中去找。感觉这里问题就出来了,如果父类跟子类使用的注入指标标签不一致的话,应该就会出现问题。也就是说如果父类中使用inject来标签注入的属性,而子类中使用disInject来指定不可以注入的属性。则先在子类中发现这个属性没找到,则haveFound就为false,则到父类中去找,由于父类使用inject标识,而一般他不会把子类的属性也标识进去,所以肯定得到的结果也是false。因此,就会给我们无法注入的结果。
    这应该是跟子类中想要表达的意思不一致:“也即子类规定的是除了disInject中规定的属性以外(或者是所有属性,即inject及disInject都没有用的情况下)的所有属性都可以注入”这一功能无法实现。
 
    这不知道算不算上是一个Bug。但想了一下,这个Bug也可以完全避免,只要把父类及子类的注入标识写一致就OK了。于是我把两者的注入标识都改成了使用disInject属性。如下:

正常的User基类

 

@FormPO(disInject = "id,status,loginTimes,lastLoginTime,lastLoginIP,roles,permissions,authorities")
public abstract class User implements Principal, UserDetails ...{

 ...

}


 

 子类PersonalUser

 

@FormPO(label="个人用户信息",disInject="score")
public class PersonalUser extends User ...{

..
}

 

    然后执行刚才的用户注册程序,验证系统终于“人性化”地按我要的出来了。呵呵,大功告成,立即走人。


 

烤鸭的BugFree使用心得

1. 什么是问题跟踪系统        问题跟踪系统(Issue Tracking System)是专门用于记录、跟踪和管理各类问题的软件。   问题跟踪系统出现于上世纪80年代,最初被企业用于跟踪和...
  • benkaoya
  • benkaoya
  • 2013年03月25日 22:14
  • 10754

实验报告一:Linux安装及环境熟悉

实验报告一 课程名称 Unix/Linux系统设计 实验日期 2016.9.4 实验项目名称 Linux安装及环境熟悉 ...
  • dkh_321
  • dkh_321
  • 2016年09月09日 18:19
  • 1706

单点登录、统一认证解决方案

随着数字化的不断普及,大型公式或者单位的各个部门逐渐的上了与本身业务相关的各种各样的系统(在这些系统中,以Web系统居多),几乎每个系统都需要识别操作者的身份,并根据其不同的身份,分配一定的权限,做一...
  • qq_24672309
  • qq_24672309
  • 2016年04月02日 12:42
  • 12645

开源Bug管理系统Redmine安装和使用心得

开源Bug管理系统Redmine安装和使用心得 分类: 职业生涯 2014-04-25 16:16 188人阅读 评论(2) 收藏 举报         终于忍受不了公司...
  • wanpiyufeng
  • wanpiyufeng
  • 2014年04月27日 21:43
  • 595

开源Bug管理系统Redmine安装和使用心得

终于忍受不了公司使用论坛+Excel来进行bug反馈和管理工作了,于是花了一个上午时间研究了下bug管理系统。这样一个bug管理系统可以轻松的查看bug新增了哪些,解决了哪些,当前是谁,要在什么时间解...
  • p3xiapingxie
  • p3xiapingxie
  • 2014年11月14日 12:00
  • 253

开源Bug管理系统Redmine安装和使用心得

终于忍受不了公司使用论坛+Excel来进行bug反馈和管理工作了,于是花了一个上午时间研究了下bug管理系统。这样一个bug管理系统可以轻松的查看bug新增了哪些,解决了哪些,当前是谁,要在什么时间解...
  • langresser
  • langresser
  • 2014年04月25日 16:16
  • 4032

基于EasyJWeb服务调度和自定义邮件引擎技术的CRM系统实战开发

分享一套教程《基于EasyJWeb服务调度和自定义邮件引擎技术的CRM系统实战开发》     在本课程当中,主要讲述了3个核心的知识点。第一个知识点是EasyJWeb框架,这也是国人自主研发...
  • peaki
  • peaki
  • 2013年12月23日 10:21
  • 754

基于EasyJWeb服务调度和自定义邮件引擎技术的CRM系统实战开发

  • 2013年12月23日 10:14
  • 128B
  • 下载

EasyJWeb服务调度和自定义邮件引擎技术的CRM系统实战开发

  • 2014年02月21日 17:18
  • 21KB
  • 下载

EasyJWeb服务调度和自定义邮件引擎技术的CRM系统实战开发

  • 2013年12月18日 16:17
  • 7KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: EasyJWeb的验证系统的Bug及使用心得
举报原因:
原因补充:

(最多只允许输入30个字)