十次方笔记(一)
docker中创建mysql
docker run -di --name=tensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
统一异常处理
需要使用自己定义的Result类来定义出现异常时的输出json,可以使用aop的异常通知来完成。
使用注解@ControllerAdvice
,异常通知,出现异常会执行
@ControllerAdvice //异常通知,出现异常会执行
public class BaseExceptionHandler {
@ExceptionHandler(Exception.class)//描述该方法作为通知代码处理,并标识异常类型
@ResponseBody
public Result exceptionHandler(Exception e){
e.printStackTrace();
return new Result(StatusCode.ERROR,false,"出现异常:"+e.getMessage());
}
}
微服务跨域问题
在类上使用注解@CrossOrigin
@RestController
@RequestMapping("/label")
@CrossOrigin //允许跨域访问
public class LabelController{
//...
}
动态条件构建
使用jpa的Specification来实现条件查询
private Specification<Label> generateSpec(Label label) {
return new Specification<Label>() {
@Override
public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> pList = new ArrayList<>();
//labelname
if (!StringUtils.isEmpty(label.getLabelname())) {
Predicate p = criteriaBuilder.like(root.get("labelname").as(String.class), label.getLabelname());
pList.add(p);
}
//state
if (!StringUtils.isEmpty(label.getState())) {
Predicate p = criteriaBuilder.equal(root.get("state").as(String.class), label.getState());
pList.add(p);
}
//recommend
if (!StringUtils.isEmpty(label.getRecommend())) {
Predicate p = criteriaBuilder.equal(root.get("recommend").as(String.class), label.getRecommend());
pList.add(p);
}
if (pList.isEmpty()) {
return null;
}
return criteriaBuilder.and(pList.toArray(new Predicate[pList.size()]));
}
};
}
使用命名规则来实现复杂的逻辑
- 查询状态为2,且以创建时间进行倒序排序,查询前4个
- 查询状态不为0,且以创建时间进行倒序排序,查询前12个
public interface RecruitDao extends JpaRepository<Recruit,String>,JpaSpecificationExecutor<Recruit>{
List<Recruit> findTop4ByStateOrderByCreatetimeDesc(String state);
List<Recruit> findTop12ByStateNotOrderByCreatetimeDesc(String state);
}