业务代码优化杂谈

       最近在审查组员代码的时候发现了几个问题,这里整理出来分享给大家,希望大家看了后有不同意见欢迎拍砖。

      一、背景:分页接口中大量的模板代码。代码如下:

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 }

通过这个例子,我们可以发现如果在开发业务过程中存在大量模板代码,那就是时候去优化了。

原文地址:https://www.cnblogs.com/mczhou2/p/15194084.html