在做透支转账时,前台报500,提示:违反检查约束条件;
不知在哪里抛出或者声明异常,请大神指点
前台报错500,内容如下:
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException:
; SQL []; ORA-02290: 违反检查约束条件 (PEPE.SALARY)
; nested exception is java.sql.SQLException: ORA-02290: 违反检查约束条件 (PEPE.SALARY)
service实现类代码如下:
(已做转账的声明式事务)
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpDao ed;
@Override
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
public void zhuan(Integer ruid, Integer chuid, Double money) {
// TODO Auto-generated method stub
//先转入
ed.updateSal(new Emp(ruid,null, money));
//再转出
ed.updateSal(new Emp(chuid, null, -money));
}
}
在dao层抛出,EmpDao
1.违反约束条件是你程序的验证没做好把,约束做好了怎么会报约束错误。
2.做全局异常处理器统一处理异常,抛就抛自己自定义的异常。
做全局异常处理器统一处理异常,抛就抛自己自定义的异常
最好是做一个异常处理类,统一处理异常,然后又异常的地方throw即可
这个你仔细看一下的你写的sql语句,多了分号什么的 你检查一次sql
估计是sql语句写的有问题,你可以试试一个简单的查询看看。
最好看下数据库的表创建语句,看下SALARY字段设置了什么约束规则或者索引,应该是更新后的数据跟字段上设置的约束规则冲突了
原来是在conroller中把对应方法try catch,然后return到提示错误页面,代码如下:
@RequestMapping("zhuan.do")
public String zhuan(Integer ruid,Integer chuid,Double money){
try {
es.zhuan(ruid, chuid, money);
} catch (Exception e) {
// TODO Auto-generated catch block
return "error.jsp";
//e.printStackTrace();
}
return "redirect:zhuan.jsp";
}
dao层处理早了
写一个全局的处理异常方法,所有异常都会被拦截
用 for each 来包住异常
使用spring AOP编程了 对异常 日志同意管理