SpringBoot使用AOP拦截请求获得对象参数的JSON

SpringBoot使用AOP拦截请求获得对象参数的JSON
例如

Entity类:

public class Company {
    private Integer id;

    private String companyName;

    private Integer companyState;

    public Company(Integer id, String companyName, Integer companyState) {
        this.id = id;
        this.companyName = companyName;
        this.companyState = companyState;
    }

    public Company() {
        super();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Integer getCompanyState() {
        return companyState;
    }

    public void setCompanyState(Integer companyState) {
        this.companyState = companyState;
    }
}

Action类:

@RestController
@RequestMapping("company")
public class CompanyAction {

    @RequestMapping(value="updateone",method=RequestMethod.POST)
    public ReturnJSON<List<Company>> updateOne(@RequestBody Company company_param){

        System.out.println("进入action");
        
        return new ReturnJSON<List<Company>>(null);
    }
}

Aop类:

@Aspect
@Component
public class LogAspect {
    
    @Pointcut("execution(public * com.action.*.*(..))")  
    public void webLog(){}  
    
    @Around("webLog()")  
    public Object arround(ProceedingJoinPoint pjp) {  
        System.out.println("方法环绕start.....");  
        try {  
            System.out.println("ARGS : " + Arrays.toString(pjp.getArgs()));  
            Object o =  pjp.proceed();  
            System.out.println("方法环绕proceed,结果是 :" + o);  
            return o;  
        } catch (Throwable e) {  
            e.printStackTrace();  
            return null;  
        }  
    }  
}

当我发出请求后,控制台显示这样:

方法环绕start.....
ARGS : [com.entity.Company@38250ab4]
进入action
方法环绕proceed,结果是 : com.entity4action.ReturnJSON@7a6f374c

我发送请求的参数是一个JSON,然后让SpringBoot自己通过JSON解析成对象Company的,但是我想用AOP来记录具体请求收到的JSON是怎样的,我应该要怎么写?是不是不应该拦截这个类,而是拦截SpringBoot的某个类?

阅读 13k
2 个回答

这就是@RequestBody和@Pointcut("execution(public com.action..*(..))")谁先生效的问题,双方都是AOP,不过看这个结果是@RequestBody先生效了,在public Object arround(ProceedingJoinPoint pjp)里面只能获取到一个Company对象,原始的json已经没了。

直接写 JsonUtil.toJson(pjp.getArgs()) 就行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题