AOP拦截controller方法注入参数 代替@RequestBody
2020-09-16 11:30:21 1180
效果如下
加上@Pass放弃aop拦截注入,使用spring mvc的参数注入
核心方法
package com.github.aop;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.annotations.Pass;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpSession;
import java.io.BufferedReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
/**
* @author mqpearth
*/
@Aspect
@Component
public class ControllerAspect {
@Autowired
ServletRequest request;
ObjectMapper objectMapper = new ObjectMapper();
@Pointcut("execution(public * com.github.controller.*.*(..))")
public void logAspect() {
}
@PostConstruct
public void config() {
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
@Around("logAspect()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Signature signature = pjp.getSignature();
MethodSignature methodSignature = (MethodSignature)signature;
Method method = methodSignature.getMethod();
if (method.getAnnotation(Pass.class) != null) {
return pjp.proceed();
} else {
return pjp.proceed(handleRequestBody(method));
}
}
private Object[] handleRequestBody(Method method) throws IOException {
BufferedReader br = request.getReader();
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
builder.append(line);
}
Parameter[] parameters = method.getParameters();
Object[] objects = new Object[parameters.length];
try {
for (int i = 0; i < objects.length; i++) {
objects[i] = objectMapper.readValue(builder.toString(), parameters[i].getType());
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return objects;
}
}
package com.github.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 方法上标记此注解,不使用aop拦截注入参数
*
* @author mqpearth
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pass {
}