springboot 对controller返回结果 切面拦截实例

         一、 业务场景:将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到返回结果当中

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值