jjwt-0.9.1造成的token签发时base64编码错误问题

异常栈如下:

一般来说都是java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter,都会有at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~[jjwt-0.9.1.jar:0.9.1]这一行。

1
2
3
4
5
6
7
8
9
10
11
java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~[jjwt-0.9.1.jar:0.9.1]
at io.jsonwebtoken.impl.DefaultJwtBuilder.signWith(DefaultJwtBuilder.java:99) ~[jjwt-0.9.1.jar:0.9.1]
at com.zwn.trainserverspringboot.util.JwtUtils.generateToken(JwtUtils.java:158) ~[classes/:na]
at com.zwn.trainserverspringboot.util.JwtUtils.generateAccessToken(JwtUtils.java:147) ~[classes/:na]
at com.zwn.trainserverspringboot.util.JwtUtils.generateAccessToken(JwtUtils.java:129) ~[classes/:na]
at com.zwn.trainserverspringboot.command.service.AuthServiceImpl.login(AuthServiceImpl.java:66) ~[classes/:na]
at com.zwn.trainserverspringboot.command.controller.UserController.login(UserController.java:26) ~[classes/:na]

具体原因是jjwt支持的JDK版本不够高,或者说当前使用的JDK版本较高。

或者,更根本的说,有部分是jwt0.9.1的依赖,在JDK11中被移除但jjwt0.9.1及之前的版本要用到,用以生成解密token。

解决方案是降低JDK版本或者补充或者替换jjwt依赖,当然,更推荐后两者,不过最高的jjwt好像就是0.9.1,所以替换的话就要更换成其他等价依赖。

 

替换依赖

换成以下三个依赖就好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
</dependency>

 

补依赖

如下,就是把新版本JDK删去的东西通过maven补上,不删除jjwt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180830.0359</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>3.0.0-M4</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>3.0.0-M4</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>

 

降JDK(能行,不推荐)