springboot 代码开发小技巧

统一返回数据格式,指定规则处理返回数据

@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
    @Autowired
    private NacosCommonConfig hjdApolloConfig;

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {

        String traceID = "";
        try {
            //获取RequestAttributes
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            //从获取RequestAttributes中获取HttpServletRequest的信息
            HttpServletRequest httpServletRequest = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
            Object attributeObject = httpServletRequest.getAttribute(AuthConstants.REQUEST_ATTRIBUTE_KEY);
            Object tempObject = httpServletRequest.getAttribute("traceID");
            if (tempObject != null) {
                traceID = String.valueOf(tempObject);
            }

            boolean isPreBoolean = false;
            if (null != attributeObject && attributeObject instanceof LoginInfo) {
                LoginInfo tempLogin = (LoginInfo) attributeObject;
                if (hjdApolloConfig.getPreShopIDList().contains(String.valueOf(tempLogin.getShopID()))) {
                    isPreBoolean = true;
                }
            }

            if (body instanceof ApiResult) {
                ApiResult tempInfo = (ApiResult) body;
                if (isPreBoolean && !StringUtils.contains(tempInfo.getMessage(), "isPre_")) {
                    tempInfo.setMessage("isPre_" + tempInfo.getMessage());
                }
                return tempInfo;
            }
        } catch (Exception e) {
            ElkLogger.error(ElkBean.builder()
                    .uniqueKey(traceID)
                    .method("ResponseAdvice err")
                    .content("统一返回处理异常").build(), e);
        }

        return body;
    }
}

统一异常处理

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ResponseBody
    @ExceptionHandler(value = {Throwable.class})
    public ResultInfo executionExceptionHandler(HttpServletRequest request, Throwable e) {
        ResultInfo resultInfo = new DataMap();

        String traceID = request.getParameter("traceID");
        if (StringUtils.isBlank(traceID)) {
            traceID = Holder.getTraceID();
        }
        String requestURI = request.getRequestURI();

        ElkLogger.error(ElkBean.builder()
                .uniqueKey(traceID)
                .requestInfo(StringUtils.isBlank(requestURI) ? "" : requestURI)
                .method("executionExceptionHandler")
                .content("未知异常").build(), e);

        resultInfo.setCode(ErrorCode.SERVER_BUSY.getCode());
        String errMsg = ErrorCode.SERVER_BUSY.getMessage();
        resultInfo.setMessage(errMsg);
        return resultInfo;
    }

统一封装用户信息

@Slf4j
@Component
public class UserInfoArgumentResolver implements HandlerMethodArgumentResolver {
    
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        Class<?> type = parameter.getParameterType();
        return null == type.getAnnotation(RequestBody.class) && ((LoginUser.class.equals(type)) || AgentLoginInfo.class.equals(type));
    }
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) {

        HttpServletRequest servletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        Object attributeObject = servletRequest.getAttribute(AuthConstants.REQUEST_ATTRIBUTE_KEY);
        LoginUser user = new LoginUser();

        if (null != attributeObject) {

            if (attributeObject instanceof LoginInfo) {
                LoginInfo tempLogin = (LoginInfo) attributeObject;
                user.setGroupID(tempLogin.getGroupID());
                user.setShopID(tempLogin.getShopID());
                user.setLoginName(tempLogin.getLoginName());
                user.setEquityAccountNo(tempLogin.getEquityAccountNo());
                user.setMobile(tempLogin.getMobile());
                user.setOperatePlatformShops(tempLogin.getOperatePlatformShops());
                user.setShopName(tempLogin.getShopName());
                user.setGroupName(tempLogin.getGroupName());
            } else if (attributeObject instanceof AgentLoginInfo) {

                return attributeObject;
            }
        }
        return user;
    }

}

使用

   @PostMapping("/jd/shopMapping.do")
    public ApiResult shopMapping(DeliveryChannelService service, LoginUser user, @RequestBody DeliveryChannelService.BindJdShopRequest request) {
        return littleRate(ApiResult.of(service.mappingJdShop(request)));
    }
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private RpcArgumentResolver rpcArgumentResolver;
    @Resource
    private UserInfoArgumentResolver userInfoArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(rpcArgumentResolver);
        argumentResolvers.add(userInfoArgumentResolver);
    }
}

Nacos配置文件可以静态引用

    public static String openOrClose = "open";

    @NacosValue(value = "${hjd.nacos.openOrClose:}", autoRefreshed = true)
    public void setOpenOrClose(String openOrClose) {
        HjdApolloConfig.openOrClose = openOrClose;
    }



   public static Set<String> printPosOrderNoChannelKey;

    @NacosValue(value = "#{'${hjd.nacos.print.orderNo.channelKey:}'.split(',')}", autoRefreshed = true)
    public void setPrintOrderNoChannelKey(Set<String> printPosOrderNoChannelKey) {
        HjdApolloConfig.printPosOrderNoChannelKey = printPosOrderNoChannelKey;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值