使用docker部署SpringBoot项目时,验证码代码恰好调用了JDK1.8底层的FontConfiguration这个类生成图片。
结果前端调用的时候抛了个异常。如下
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
at sun.font.SunFontManager$2.run(SunFontManager.java:431)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<init>(SunFontManager.java:376)
at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
......
.....
比较有效的解决办法是装ttf-dejavu
修改前Dockerfile:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD xx.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
追加一句话重新打包、编译、部署即可。
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig
修改后Dockerfile:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD xx.jar app.jar
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
由于验证码需要的特殊字体在系统里是不存在的,不过sun的JDK是可以调用的,而openJDK不行,所以要么换JDK、要么安装字体库。
问题使用docker部署SpringBoot项目时,验证码代码恰好调用了JDK1.8底层的FontConfiguration这个类生成图片。结果前端调用的时候抛了个异常。如下 123456789101112131415161718192021 java.lang.NullPointerException: null at sun.awt.FontConfiguration.getVersion(FontCon
java.lang.NullPointerException: null
2020/5/29 上午8:40:11 at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
2020/5/29 上午8:40:11 at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)报错问题解决
项目场景:
使用docker发布微服务时,因项目中有登录操作,需要图片验证码验证
问题描述:
由于在构建docker镜像时使用的是openjdk而不是oraclejdk,在生成图片验证码时出现了问题,后台报错
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.g
线上遇到了一个问题,一个导出Excel的功能,在将数据生成excel文件到本地时,出现空指针异常。但是两台服务器只有一台服务器有这个问题,两台服务器的环境基本相同,使用同一个jar包,同样的请求。
异常信息
在本地,和另一台服务器验证都没有问题。
检查报错的业务代码位置,写法没有问题,打印log,传参也都有值。
因此,基本不会是代码的问题。
百度打印出的第一行报错信息FontConfiguration.getVersion。
得到第一个搜索结果FontConfiguration.getV
这三个问题都是本地好的,打包就不行的解决方案,
FontConfiguration.java:1264 空指针问题由于使用了FROM openjdk:8-jdk-alpine造成的,
需要更换为FROM openjdk:8u212-jre
在Dockerfile文件中更改
改完之后又发现中文乱码。。。。
然后发现dacker打包的镜像缺少我需要的字体
解决方案就是将字体打入镜像
首先在Dockerfile文件的同级目录下放入需要的字体文件 .ttf文件格式的,
然后在Dockerfile文件中copy该
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.InternalError: java.lang.reflect.InvocationTargetException
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServle.
docker中OpenJDK excel无法导出 java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion
1.背景说明:
本地使用的是jdk1.8版本功能可正常使用,当通过docker打包镜像部署到linux环境下(openJDK1.8)后无法导出excel,报初始化是否,空指针异常,报错如下:
2.原因:
openjdk比jdk1.8简化了一些功能,所以用docker打包的时候更小。excel导出时初始化失败就是因为f
记录一下开发过程中遇到的问题
公司项目一直采用的都是OracleJDK 1.8版本,领导决定给项目的JDK升级到JDK11,我们采用的是开源的版本Liberica JDK 11,他们长期支持维护JDK8、JDK11、JDK17。
Liberica 官网链接 https://bell-sw.com/pages/downloads/#/java-17-lts%20/%20current。
在我们开发环境先行替换成OpenJDK11后,
项目中使用EasyExcel导出文件开始报NullPointerEx
sudo apt install fontconfig
参考网址:java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion
出现这个错误是因为Docker中的工作簿(Workbook)已经包含了一个“s”。
Java.lang.IllegalArgumentException是Java中的一个异常类,用于指示方法接收了非法或不适当的参数。在这种情况下,异常的具体信息是the workbook already contains a s,意思是工作簿已经包含了一个“s”。
这个错误通常出现在使用Apache POI等Java库处理Excel文件时。工作簿(Workbook)是一个Excel文件的数据结构,它包含了多个工作表(Sheet)。在创建工作表之前,我们需要确保工作簿中没有重复名称的工作表。
解决这个问题的方法是在创建工作表之前,先检查工作簿中是否已经存在同名的工作表。如果存在,则抛出IllegalArgumentException异常,提示工作簿已经包含了一个相同名称的工作表。可以使用Workbook类的getSheet()方法来获取已有的工作表并进行判断。
另外,也可以考虑在创建新工作表时为其指定一个唯一的名称,以避免与已有工作表重名的情况。
综上所述,当在Docker中使用Java处理Excel文件时出现Java.lang.IllegalArgumentException:the workbook already contains a s的错误时,应该检查工作簿中是否已经存在相同名称的工作表,并根据需要进行工作表的创建和命名。
### 回答2:
这个异常是因为在使用Docker时,调用了Java的Apache POI库的Workbook对象的createSheet方法,但是工作簿已经包含了一个同名的Sheet。
Workbook对象是Apache POI库中一个表示Excel工作簿的接口,其用于操作Excel的各种操作,包括创建和访问Sheet。createSheet方法是用于创建一个新的Sheet,并将其添加到工作簿中。
当调用createSheet方法时,会检查工作簿中是否已经存在了一个同名的Sheet。如果存在,则会抛出IllegalArgumentException异常,提示工作簿已经包含了一个同名的Sheet。
解决这个问题的方法是在添加Sheet之前,先检查工作簿中是否已经存在同名的Sheet,如果存在则先删除或重命名原有的Sheet,然后再调用createSheet方法。
示例代码如下:
Workbook workbook = // 获取工作簿对象
String sheetName = // 要创建的Sheet的名称
// 检查工作簿中是否已经存在同名的Sheet
if (workbook.getSheet(sheetName) != null) {
// 存在同名的Sheet,可以选择删除或重命名原有的Sheet
workbook.removeSheetAt(workbook.getSheetIndex(sheetName)); // 删除原有的Sheet
// 或 workbook.setSheetName(workbook.getSheetIndex(sheetName), newName); // 重命名原有的Sheet
Sheet sheet = workbook.createSheet(sheetName); // 创建新的Sheet
通过这样的处理,可以避免在Docker中使用Apache POI库时出现IllegalArgumentException异常。
nginx响应超时upstream timed out (110: Connection timed out) while reading response header from upstream
34147
普通链接二维码打开小程序实现动态传递参数
m0_58735177:
k8s搭建gitlab
wst021sh: