一、Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException:
粗心错误:调用JPA进行更新操作报错;
原因:没有使用事务
解决方案:方法上增加@Transactional
@Transactional 注解用于提交事务,若没有带上这句,会报事务异常提示。
注意:更新删除操作都要加上@Modifying,@Transactional。有时候不加还会报其他错误。
参考:参考1
二、正则表达式
记录一下:参数校验注解:
@Pattern(regexp = "^[\u4e00-\u9fa5a-zA-Z0-9_]+$")//中文。英文。数字。下划线_
如果不用注解的话也可以判断字符串是否符合某正则表达式:
利用Pattern,下面是matches方法:
更多正则参考:参考1
三、全局级别异常处理器@ControllerAdvice+@ExceptionHandler
@ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度
@ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理剥离开;其是对Controller层进行拦截
@ResponseStatus:可以将某种异常映射为HTTP状态码
@ControllerAdvice
public class GlobalController {
@ExceptionHandler(RuntimeException.class)
public ModelAndView fix1(Exception e){
System.out.println("全局的异常处理器");
ModelMap mmp=new ModelMap();
mmp.addAttribute("ex",e);
return new ModelAndView("error",mmp);
}
}
这种方法支持返回多种类型,@ResponseBody、@ResponseEntity、ModelAndView。
这次有个要求就是,返回信息里要求code:401并提示权限不合法,但是code Status要求是200。这样返回给前端好进行处理。
shiro的异常处理方法上@ResponseStatus(HttpStatus.UNAUTHORIZED)就表示了返回status:401。如果删了或者改成HttpStatus.OK的话成功就是200。
四、树形结构递归查子节点
这个当时花了点时间,记录一下:(为了减少查询数据库次数,一次性把所有都查出来再递归)
1)删除部门的时候需要把子部门也删除
/**
* 找到要删除的部门的id和其子部门的id
*/
private Set<Integer> findDepartmentIdAndChildDepartmentIds(Integer departmentId) {
List<Department> childDepartment = new ArrayList<>();
findChildDepartments(departmentsRepository.findAll(), departmentId, childDepartment);
Set<Integer> departmentIds =
childDepartment.stream().map(Department::getId).collect(Collectors.toSet());
departmentIds.add(departmentId);
return departmentIds;
}
/**
* 递归找出该部门下所有子部门信息
*/
private void findChildDepartments(
List<Department> departments, int departmentId, List<Department> childDepartment) {
for (Department department : departments) {
if (department.getPid() == departmentId) {
findChildDepartments(departments, department.getId(), childDepartment);
childDepartment.add(department);
}
}
}
2)判断该部门是第几层
/**
1. 计算该部门的上级部门数
*/
int level = 0;
private void countParentDepartments(List<Department> departments, int pid) {
for (Department department : departments) {
if (department.getId() == pid) {
level++;
countParentDepartments(departments, department.getPid());
}
}
}
五、其他记录
记录暂时不紧急,或用不到,或以后会用到,或需要注意的点: