一个友好的应用应该提供给用户明确的信息提示,比如说“用户名已经存在” “用户名过长”.....
这些信息根源于数据库中设计的各种约束。当操作出发这些约束的时候,会得到一个spring包装起来的dataAccessException异常。我现在的做法是在dao包用了一个pointcut,织入了after-throwing通知,打算重新抛一个自定义的异常给业务层。
但是现在的问题是,不知道怎么去细分dataAccessException,只能用ex.getRootCause()得到一些信息。
这些信息根源于数据库中设计的各种约束。当操作出发这些约束的时候,会得到一个spring包装起来的dataAccessException异常。我现在的做法是在dao包用了一个pointcut,织入了after-throwing通知,打算重新抛一个自定义的异常给业务层。
但是现在的问题是,不知道怎么去细分dataAccessException,只能用ex.getRootCause()得到一些信息。
解决方案 »
- jsp提交text,request后为空
- 数据库登陆
- 当“SELECT *** FOR UPDATE NOWAIT”遇上conn.setAutoCommit(false); 请专家指点
- 为什么用外网IP地址访问不了 TOMCAT5.5/6.0 服务器!
- 在hibernate3.0中怎么写统计表中共有多少条记录的语句,谢谢
- 一个英语问题哈
- Linux下jsp的字符集问题
- 请教hibernate自定义配置文件的用法
- 请问一下什么叫中间件?
- 救命!struts的一个简单例子程序,用jbuilder8编译时没错,但运行时出现这样的错误:
- velocity中如何从map中获得list中的list里面的值?
- mysql 的更新问题,那位大侠帮忙解决一下,非常感谢!
这些检查是有必要的,可以防止注入式攻击,包括有效字符,长度等像楼主的需求,可以分析一下rootcause,抽象出某几个业务层的信息就可以了,其他的可以可以归为一类
1、用Hibernate验证,例如:@Length(max=30,message="用户名最多只能为30个字符")
private String username;然后可用以下这个方法来检测实体:
ClassValidator<T> cv = new ClassValidator(clazz);
InvalidValue[] message = cv.getInvalidValues(t);
if(message.length > 0){
for(InvalidValue iv : message){
//iv.getPropertyPath()为出错的属性
//iv.getMessage());为该属性出错的消息
}
}
}
通过Hibernate事件也可以检测JDBC反馈消息,例如不能插入重复值。2、用楼主所说的AOP方案
但最好也参考Hibernate的验证思想,即在实体上用注解的方式(或xml)来标定每个属性的长度、唯一性、数据库类型等等。@valid(length={30,"长度不能超过30"},unique={true,"用户名必须唯一"})
private String username;然后在aop的point中拦截要被保存或更新的实体,用内省和反射来检测每个属性配置的长度并抛错,其实是和Hibernate验证是一个道理,无非这样好控制一些,例如可以控制到数据进入数据库时发生的错误——用户名重复等等