统一返回数据格式,指定规则处理返回数据
@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;
}