BUG
共享文件问题
在使用java实现生成验证码时,出现
java.lang.UnsatisfiedLinkError: /opt/zulu21.32.17-ca-jdk21.0.2-linux_x64/lib/libawt_xawt.so: libXrender.so.1: cannot open shared object file: No such file or directory
java.lang.UnsatisfiedLinkError: /opt/zulu21.32.17-ca-jdk21.0.2-linux_x64/lib/libawt_xawt.so: libXtst.so.6: cannot open shared object file: No such file or directory
等共享文件问题,在java运行jar包时加入-Djava.awt.headless=true
参数就可以解决!
- 参数说明:
-Djava.awt.headless=true
是Java虚拟机(JVM)参数,用于在没有图形界面的环境下运行Java应用程序。在headless模式下,Java AWT(Abstract Window Toolkit)和Java Swing不会尝试创建本地窗口或图形界面组件,而是将所有图形操作转换为非图形的形式,使得Java应用程序可以在服务器或嵌入式系统等没有图形环境的环境下运行。
字体问题
java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration
在 Linux 系统中,字体文件通常存储在特定的目录中,字体文件位于以下几个常见的目录中之一:
-
/usr/share/fonts: 这是一个常见的字体文件存放目录,系统安装的字体通常会存储在这里。您可以在此目录下找到系统自带的字体和其他安装的字体。
-
/usr/local/share/fonts: 一些自定义安装的字体可能会存储在此目录中。这是一个用于存放本地安装的字体文件的常见位置。
-
/home/username/.fonts: 每个用户的个人字体目录通常位于用户的主目录下,名为
.fonts
。用户可以在此目录下安装自己喜欢的字体。 -
/etc/fonts: 这是系统中字体配置文件的存放目录。虽然不是存放字体文件的地方,但是在此目录下您可以找到与字体相关的配置文件,例如
fonts.conf
。
以上路径可能在不同的 Linux 发行版中有所不同。也可以通过以下方法之一来确定字体文件的存放位置:
- 使用命令行工具(如
find
或locate
)搜索系统中的字体文件。 - 查看图形用户界面中的字体管理工具,例如 GNOME 中的 Font Viewer。
- 查看系统字体配置文件,如
/etc/fonts/fonts.conf
,其中可能会指定字体文件的位置。
解决办法:添加字体文件,之后执行
fc-cache -f -v
刷新字体缓存,然后重启应用!
mybatis中parameterType
在使用mybatis时,如果只有一个参数,我们通常会在mapper中将 parameterType 设置为 String 或者Integer 等基本数据类型。如下:
@Mapper
public interface Test {
void testMethod(Integer type);
}
mapper中通过parameterType获取参数
<select id="testMethod" parameterType="Integer" resultType="com.xx.Test">
SELECT * from test_table WHERE type = #{type}
<if test="type == 1">
AND status=2
</if>
</select>
这样的xml配置会报错,报错内容如下
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'schoolId' in 'class java.lang.Integer'
主要原因是标签中通过getter方法取值,而Integer没有getter方法,所以会出现问题。而#{type}是可以取到值的!
解决办法一:
@Mapper
public interface Test {
void testMethod(@Param Integer type);
}
具体原理:(猜的)@Param会将参数转为map对象,使用参数名作为key,参数值作为value,这样在标签中调用getter方法时就能获取到了、
解决办法二:
<select id="testMethod" parameterType="integer" resultType="com.xx.Test">
SELECT * from test_table WHERE type = #{type}
<if test="_parameter == 1">
AND status=2
</if>
</select>
在这里,我看到别的文章中提到在parameter=String时,在 mapper.xml 中可以使用 #{aaa} 或者 #{bbb} 或任意值取值,在这实测,只能使用形参名进行取值,也就是必须是#{type},否则会报错:
Parameter 'aaa' not found. Available parameters are [type]
解决办法三:
将参数封装在map或者对象中传递
@Mapper
public interface Test {
void test(Map<String,Integer> map);
}
或者
@Mapper
public interface Test {
void testMethod(KeyValueBean bean);
}
class KeyValueBean {
private Integer type;
//生成setter和getter方法
}
评论区