PraiseController.java
//点赞文章 @RequestMapping(value = "on",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) public BaseResponse praiseOn(@RequestBody @Validated PraiseDto dto, BindingResult result){ String checkRes= ValidatorUtil.checkResult(result); if (StringUtils.isNotBlank(checkRes)){ return new BaseResponse(StatusCode.InvalidParams.getCode(),checkRes); } BaseResponse response=new BaseResponse(StatusCode.Success); try { response.setData(praiseService.praiseOn(dto)); }catch (Exception e){ response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage()); } return response; }PraiseService.java
//点赞文章 @Transactional(rollbackFor = Exception.class) public Boolean praiseOn(PraiseDto dto) throws Exception{ final String recordKey= Constant.RedisArticlePraiseUser+dto.getArticleId()+dto.getUserId(); //判断当前用户是否已点赞当前的文章(判断当前用户是否可以点赞该文章) - 控制并发操作的风险(并发安全的一种 - 分布式锁的体现) Boolean canPraise=redisTemplate.opsForValue().setIfAbsent(recordKey,1); //redisTemplate.hasKey(recordKey); //压测过后会发现,这种写法是有并发安全性的问题. if (canPraise){ //将点赞的数据插入到db ArticlePraise entity=new ArticlePraise(dto.getArticleId(),dto.getUserId(),DateTime.now().toDate()); int res=praiseMapper.insertSelective(entity); if (res>0){ //叠加当前文章的点赞总量 articleMapper.updatePraiseTotal(dto.getArticleId(),1); } } return true; }PraiseDto.java
@Data public class PraiseDto implements Serializable{ //当前用户id @NotNull(message = "当前用户id不能为为空!") private Integer userId; //文章id @NotNull(message = "当前文章id不能为为空!") private Integer articleId; //文章标题 ~ 开发技巧 ~ 服务于排行榜(如微博的热搜,只显示其标题,而不需要再根据id查询db获取标题...) @NotNull(message = "当前文章标题不能为空!") private String title; public PraiseDto(Integer userId, Integer articleId, String title) { this.userId = userId; this.articleId = articleId; this.title = title; } }开发技巧:在创建数据库表的时候,文章的默认点赞量为0,不然无法直接进行+1(点赞数量+1)操作。
遇到的问题
问题分析:构造函数中未给属性赋值,而是直接写了一个空的方法体!!!!!!