@Transactional报错+正则表达式+全局级别异常处理器@ControllerAdvice+@ExceptionHandler+树形结构递归查子节点+其他记录=10/19-10/23

一、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参考2

四、树形结构递归查子节点

这个当时花了点时间,记录一下:(为了减少查询数据库次数,一次性把所有都查出来再递归)
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());
      }
    }
  }

五、其他记录

记录暂时不紧急,或用不到,或以后会用到,或需要注意的点:

  1. 注意流式写法如果有异常只能trycatch捕获,没法抛出。但是有提供orElseThrow。参考1
  2. @SCHEDULED(CRON = “0 0 * * * ?”)实现定时任务。参考1
  3. Java中文乱码字符集解决。参考1
  4. 7+-2法则是由美国认知心理学家乔治-A-米于1956年发表在《心理学评论》上的一篇重要论文这篇论文指出,年轻人的记忆广度大约为7个单位(阿拉伯数字、字母、单词或其他单位,称为组块),也就是说,如果达到7个及以上大部分人就很难对其短时记忆(如果是年龄稍大的就很难说了),因此从记忆力上来说6位是最符合短时记忆的。参考1
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值