天天看點

Springboot自定義注解、帶參數、改變Controller傳回資料1、建立一個自定義注解類2、建立自定義注解切片操作類,并傳回自定義的參數替代原controller參數3、測試自定義注解

1、建立一個自定義注解類

這個類主要用在控制使用者接口級操作權限上。是以需要定義permissionName(權限名稱)達到可以帶參數進入的效果。

package com.kingteam.permission.annotation;

import java.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.core.Ordered;  

/**
 * 定義權限注解
 * @author 秦曉宇
 * @date: 2020年10月18日 上午12:22:41 
 * @record:
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//最高優先級  
@Order(Ordered.HIGHEST_PRECEDENCE)  
public @interface PermissionAnnotation {

	/** 
	* @Description: 權限名稱 
	* @Title: permissionName 
	* @return String
	* @author qin
	* @date 2020年10月18日上午12:16:43
	*/ 
	String permissionName() default "";
	
}
           

2、建立自定義注解切片操作類,并傳回自定義的參數替代原controller參數

做一個簡單的判斷:如果輸入的參數和abc相同,則傳回原結果;如果輸入的參數和abc不同,則傳回沒有權限的提醒。

package com.kingteam.permission.annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import com.kingteam.util.common.returnBean.ReturnBean;

/**
 * 權限AOP注解切片處理
 * @author 秦曉宇
 * @date: 2020年10月18日 上午12:00:57 
 * @record:
 */
@Aspect
@Component
public class PermissionAnnotationAspect {

	@Pointcut("@annotation(com.kingteam.permission.annotation.PermissionAnnotation)")
    public void point(){
//        System.out.println("12");
    }
    @Before("point()")
    public void begin() throws Exception{
//        System.out.println("begin");
    }
    @AfterReturning("point()")
    public void after(){
//        System.out.println("commit");
    }

    @Around(value = "@annotation(d)", argNames = "d")
    public ReturnBean around(ProceedingJoinPoint joinPoint,PermissionAnnotation d) throws Throwable{
        System.out.println("---"+d.permissionName());
        System.out.println("around begin");
        if(!d.permissionName().equals("abc"))
        	return ReturnBean.simpleError("您沒有這個權限");
        else
        {
            ReturnBean returnBean = (ReturnBean) joinPoint.proceed();
            System.out.println("around commit");
            return returnBean;
        }
    }
}
           

3、測試自定義注解

3.1、測試輸入參數和abc不同的情況

package com.kingteam.permission.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.kingteam.permission.annotation.PermissionAnnotation;
import com.kingteam.util.common.returnBean.ReturnBean;

@Controller  
@RequestMapping("/permission/")  
public class PermissionController {

	@PermissionAnnotation(permissionName = "abcd")
	@RequestMapping(value="test")  
    public @ResponseBody ReturnBean test(
    ){
		System.out.println("ReturnBean test");
		return ReturnBean.simpleSuccess("123");
	}
}
           

運作結果:輸入和參數和abc不同,請求被攔截。同時controller中的操作也不會進行。注意要改變傳回資料的話return傳回資料位置,要在joinPoint.proceed();之前。

{
    "result": false,
    "describe": "您沒有這個權限",
    "data": null
}
           

3.2、測試輸入參數和abc相同的情況

package com.kingteam.permission.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.kingteam.permission.annotation.PermissionAnnotation;
import com.kingteam.util.common.returnBean.ReturnBean;

@Controller  
@RequestMapping("/permission/")  
public class PermissionController {

	@PermissionAnnotation(permissionName = "abc")
	@RequestMapping(value="test")  
    public @ResponseBody ReturnBean test(
    ){
		System.out.println("ReturnBean test");
		return ReturnBean.simpleSuccess("123");
	}
}
           

運作結果:controller中的方法被執行,傳回執行的資料。

{
    "result": true,
    "describe": "123",
    "data": null
}