一、 业务场景:将controller层最终返回的信息,抓取返回的code,然后根据自定义的国际化code配置文件,根据返回结果中的code,添加code对应的中文解释。
二、思路:
1、做一个AOP切面,把所有的controller层方法作为切入点,使用@AfterReturning,对切入点的返回结果进行增强处理,如以下代码所示
/**
* 处理返回结果为 UnifyResponseVO 的视图函数
* 默认的返回均是英文,在此处通过code替换成中文
*
* @author pedro@TaleLin
* @author colorful@TaleLin
* @Aspect:作用是把当前类标识为一个切面供容器读取
*/
@Aspect
@Component
@Slf4j
public class ResultAspect {
/**
* 将所有controller层级的方法 作为切入点
*/
@Pointcut("execution(public * io.github.talelin.latticy.controller..*.*(..))")
public void handlePlaceholder() {
}
/**
* pointcut/value:这两个属性的作用是一样的,它们都属于指定切入点对应的切入表达式
* 。一样既可以是已有的切入点,也可直接定义切入点表达式。当指定了pointcut属性值后,value属性值将会被覆盖。
* 在这里 把已经定义好的handlePlaceholder 作为切入点
* <p>
* returning:该属性指定一个形参名,用于表示Advice方法中可定义与此同名的形参,该形参可用于访问目标方法的返回值。
* 除此之外,在Advice方法中定义该形参(代表目标方法的返回值)时指定的类型,会限制目标方法必须返回指定类型的值或没有返回值。
*/
@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注解获取一个配置信息,如以下代码所示:
/**
* @author pedro@TaleLin
*
* 当获取主配置文件中属性值时,只需@ConfigurationProperties(prefix = "person")注解来修饰某类,其作用是告诉springBoot,
* 此类中的属性将与默认的全局配置文件中对应属性一一绑定。
* 属性名必须是application.yml或application.properties。【prefix = "person"】表示与配置文件中哪个层级的属性进行绑定。
* 当一些属性不想配置到主配置文件,需自定义一个配置文件,需通过@PropertySource注解指定此配置文件路径。
*
* 个人理解 添加配置类注解后 根据配置文件的类型 自定义 Set 方法后 就可以获取配置文件的信息
*/
@SuppressWarnings("ConfigurationProperties")//忽略@ConfigurationProperties 注解的警告
@Component
@ConfigurationProperties
@PropertySource(value = "classpath:code-message.properties", encoding = "UTF-8")
public class CodeMessageConfiguration {
private static Map<Integer, String> codeMessage = new HashMap<>();
public static String getMessage(Integer code) {
return codeMessage.get(code);
}
public Map<Integer, String> getCodeMessage() {
return codeMessage;
}
public void setCodeMessage(Map<Integer, String> codeMessage) {
CodeMessageConfiguration.codeMessage = codeMessage;
}
}
3、封装好信息配置类后,在切面中我们可以获取到controller返回的code,我们拿到这个使用配置类当中的getMessage 获取对应的中文解释,最后将其set到返回结果当中