最近在审查组员代码的时候发现了几个问题,这里整理出来分享给大家,希望大家看了后有不同意见欢迎拍砖。
一、背景:分页接口中大量的模板代码。代码如下:
PageVO<UserSettle> result = new PageVO<>(); Page page = PageHelper.startPage(userSettleQueryDTO.getPage(), userSettleQueryDTO.getSize()); List<UserSettle> userSettles = userSettleMapper.queryAllByPage(userSettleQueryDTO); PageInfo pageInfo = new PageInfo<>(page.getResult()); result.setPage(pageInfo.getPageNum()); result.setSize(pageInfo.getPageSize()); result.setTotal(pageInfo.getTotal()); result.setDataList(userSettles); return result;
对于这种代码,直接告诉我这样写不合理。想到我在整理框架的时候,使用了统一的结果返回,所以这块提了一个建议。这里先直接上修改之后的代码
Page page = PageHelper.startPage(userSettleQueryDTO.getPage(), userSettleQueryDTO.getSize()) .doSelectPage(() -> userSettleMapper.queryAllByPage(userSettleQueryDTO)); return page;
修改之后是不是就很简单了,那全局返回结果怎么处理的呢
1 @RestControllerAdvice 2 public class ResponseControllerAdvice implements ResponseBodyAdvice<Object> { 3 4 5 @Override 6 public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) { 7 //如果接口返回类型本身就是ResultVO那就没必要进行额外的操作,返回false 8 String name = methodParameter.getMethod().getDeclaringClass().getName(); 9 return Objects.nonNull(name) && name.contains("xx.xx.controller") && !methodParameter.getParameterType().equals(ResultVO.class); 10 } 11 12 @Override 13 public Object beforeBodyWrite(Object data, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { 14 // String类型不能直接包装,所以要进行些特别的处理 15 if (methodParameter.getGenericParameterType().equals(String.class)) { 16 ObjectMapper objectMapper = new ObjectMapper(); 17 try { 18 // 将数据包装在ResultVO里后,再转换为json字符串响应给前端 19 return objectMapper.writeValueAsString(new ResultVO<>(data)); 20 } catch (JsonProcessingException e) { 21 throw new APIException("返回String类型错误"); 22 } 23 } 24 //对于分页返回结果处理 25 if (methodParameter.getParameterType().equals(Page.class)) { 26 Page page = (Page) data; 27 PageVO result = new PageVO(); 28 result.setPage(page.getPageNum()); 29 result.setSize(page.getPageSize()); 30 result.setTotal(page.getTotal()); 31 result.setDataList(page.getResult()); 32 return new ResultVO<>(result); 33 } 34 // 将原本的数据包装在ResultVO里 35 return new ResultVO<>(data); 36 } 37 }
通过这个例子,我们可以发现如果在开发业务过程中存在大量模板代码,那就是时候去优化了。