一、 业务场景:将controller层最终返回的信息,抓取返回的code,然后根据自定义的国际化code配置文件,根据返回结果中的code,添加code对应的中文解释。
二、思路:
1、做一个AOP切面,把所有的controller层方法作为切入点,使用@AfterReturning,对切入点的返回结果进行增强处理,如以下代码所示
@Aspect
@Component
@Slf4j
public class ResultAspect {
@Pointcut("execution(public * io.github.talelin.latticy.controller..*.*(..))")
public void handlePlaceholder() {
}
@AfterReturning(returning = "ret", pointcut = "handlePlaceholder()")
public void doAfterReturning(Object ret) throws Throwable {
System.out.println("ResultAspect result");
System.out.println(ret);
if (ret instanceof UnifyResponseVO) {
UnifyResponseVO result = (UnifyResponseVO) ret;
int code = result.getCode();
String message = CodeMessageConfiguration.getMessage(code);
if (StrUtil.isNotBlank(message) && StrUtil.isBlank((CharSequence) result.getMessage())) {
result.setMessage(message);
}
}
}
}
2、封装一个配置类,将code和对应的value值通过一个Map获取(配置文件中是key-value格式)。使用@ConfigurationProperties 以及 @PropertySource注解获取一个配置信息,如以下代码所示:
@SuppressWarnings("ConfigurationProperties")//忽略@ConfigurationProperties 注解的警告
@Component
@ConfigurationProperties
@PropertySource(value = "classpath:code-message.properties", encoding = "UTF-8")
public class CodeMessageConfiguration {
private static Map codeMessage = new HashMap<>();
public static String getMessage(Integer code) {
return codeMessage.get(code);
}
public Map getCodeMessage() {
return codeMessage;
}
public void setCodeMessage(Map codeMessage) {
CodeMessageConfiguration.codeMessage = codeMessage;
}
}
3、封装好信息配置类后,在切面中我们可以获取到controller返回的code,我们拿到这个使用配置类当中的getMessage 获取对应的中文解释,最后将其set到返回结果当中



