文章目录
0.问
ps:急就直接看2.问题解决
一个方法,本地可以跑,但是放到部署环境就无法跑,报错方法不存在。
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: com.itextpdf.text.Image.scaleToFit(Lcom/itextpdf/text/Rectangle;)V
解决思路:
1.怀疑pom有深层的依赖冲突。
1、执行 mvn dependency:tree -Dverbose
2、在有依赖的包下面加上排除
xml
<exclusions>
<exclusion>
<artifactId>com.itextpdf</artifactId>
<groupId>itextpdf</groupId>
</exclusion>
<exclusions>
3、重试,没用!谢特。应该不是依赖版本冲突。
排除类冲突,应该也不是方法不存在,如果真是方法不存在,那么构建就会出问题,但是jar包构建没有出问题,能正常启动。
4、下载部署环境的依赖jar包,检查类方法都存在,且版本一致。
2.问题解决
在线上环境打印类里面所有的方法,找一个可以用的
还真被我找到一个重载的方法
java
private static void log() {
String className = "com.itextpdf.text.Image";
String methodName = "scaleToFit";
Class<?>[] parameterTypes = {com.itextpdf.text.Rectangle.class};
try {
Class<?> clazz = Class.forName(className);
// Check version
Package pkg = clazz.getPackage();
if (pkg != null) {
String implementationVersion = pkg.getImplementationVersion();
String specificationVersion = pkg.getSpecificationVersion();
log.info("[getPdfWatermarkImageLog] Implementation Version: {}", implementationVersion);
log.info("[getPdfWatermarkImageLog] Specification Version: {}", specificationVersion);
} else {
log.info("[getPdfWatermarkImageLog] Package information is not available.");
}
// Check methods
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
log.info("[getPdfWatermarkImageLog] Method: {}, name:{}, parameterTypes:{}", method, method.getName(), method.getParameterTypes());
}
// Check if a specific method exists
try {
Method specificMethod = clazz.getDeclaredMethod(methodName, parameterTypes);
log.info("[getPdfWatermarkImageLog] Method :{} (Rectangle) exists. :{}", methodName, specificMethod);
} catch (NoSuchMethodException e) {
log.info("[getPdfWatermarkImageLog] Method {} (Rectangle) does not exist.", methodName);
}
} catch (ClassNotFoundException e) {
log.error("[getPdfWatermarkImageLog] Class not found: {}", className, e);
}
}
果然,方法不存在,但是有另一个可以替代的
日志1: [getPdfWatermarkImageLog] Method scaleToFit(Rectangle) does not exist.
日志2:[getPdfWatermarkImageLog] Method: public void com.itextpdf.text.Image.scaleToFit(float,float), name:scaleToFit, parameterTypes:[float, float]
偷鸡解决。