整体思路:
自定义注解
定义切面
切面任务处理
定义注解
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Language {
}
定义切面
/**
* 语言识别AOP
*/
@Aspect
@Order(3)//执行顺序,数值最大,最后执行
@Component
public class LanguageAspect {
@Autowired
private LanguageTransUtil languageTransUtil;
/***
* 注解 作用在类上要用 @within
* 注解 作用在方法上要用 @annotation
* @param joinPoint
* @param o
*/
@Pointcut("@within(com.xxx.Language)")
public void languagePointCut() {
}
@Around("languagePointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
Result result = new Result();
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
//执行方法
result = (Result) point.proceed();
result = languageTransUtil.transResultMessage(request, result);
return result;
}
}
public class HttpContextUtils {
public static HttpServletRequest getHttpServletRequest() {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
}
}
任务处理
@Component
public class LanguageTransUtil {
public Result transResultMessage(HttpServletRequest request, Result result) {
String flag = request.getHeader(Constant.LANGUAGE);
if (StringUtils.isNotEmpty(flag) && !ObjectUtils.isEmpty(result)) {
if (StatusCode.LANGUAGE_CN.equals(flag)) {
result.setMsg(ExampleErrorCode.getCnMsgByCode(result.getCode()));
} else {
result.setMsg(ExampleErrorCode.getEnMsgByCode(result.getCode()));
}
return result;
}
result.setMsg(ExampleErrorCode.getEnMsgByCode(result.getCode()));
return result;
}
}
注:请求头中定义language表示中文还是英文,然后将注解写在controller上即可