1.问题描述
我使用AOP记录请求入参和响应,异步写入es,在获取请求入参的参数名时候,发现在本地没问题,发到云上测试环境就取不到了。
private Map<String,Object> buildRequestParam(ProceedingJoinPoint joinPoint){
MehtodSignature signature = (MethodSignature)joinPoint.getSignature();
String[] parameterNames = signature.getParameterNames();
...
}
2.问题分析
本地和测试环境唯一不同的就是jdk的版本,测试环境使用的dockerfile中的openjdk:8u252,本地开发时用的是jdk1.8.0_45,经过一番查询,发现是在Java8之前,代码编译为class文件后,方法参数的类型固定,但是方法名称会丢失,方法名称会变成arg0、arg1....。而现在,在Java8开始可以在class文件中保留参数名,这就给反射带来了极大的遍历。像mybatis等需要使用反射机制获取方法参数的时候就可以不用像以前一样需要使用类似于@Param之类的注解。
3.解决方案
推荐修改maven
在pom.xml中,添加
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
标签:maven,SpringBoot,JDK,入参,---,获取,参数,AOP,测试环境
From: https://www.cnblogs.com/hujunwei/p/18119512