Spring Boot java.lang.NoClassDefFoundError:使用Java 11解码JWT标记时的javax/xml/bind/DatatypeConverter

fruv7luv  于 2023-01-13  发布在  Spring
关注(0)|答案(2)|浏览(346)

当调用此方法对JWT标记javax.xml.bind.DatatypeConverter.parseBase64Binary(编码)进行解码时,我收到此异常:

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1082)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)

Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26)
at io.jsonwebtoken.impl.Base64UrlCodec.decode(Base64UrlCodec.java:78)
at io.jsonwebtoken.impl.AbstractTextCodec.decodeToString(AbstractTextCodec.java:36)
at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:251)
at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:481)
at io.jsonwebtoken.impl.DefaultJwtParser.parseClaimsJws(DefaultJwtParser.java:541)

我有这个项目的外部库等:

implementation "jakarta.xml.bind:jakarta.xml.bind-api:3.0.1"
  implementation "org.glassfish.jaxb:jaxb-runtime:3.0.2"
  io.jsonwebtoken:jjwt:0.9.1
javax.xml.bind:jaxb-api:2.3.1

在外部库javax.xml.bind:jaxb-api:2.3.1中,我可以找到代码中使用的javax/xml/bind/DatatypeConverter,所以我不明白为什么会收到NoClassDefFoundError。
我在项目和Spring Boot 中使用Java 11。
谢谢你的帮助。

u5rb5r59

u5rb5r591#

在gradle中添加此行。
实现“javax.xml.bind:jaxb-api:2.4.0-b180830.0359”
将您的javax.xml.bind:jaxb-api降级为特定版本。

n3ipq98p

n3ipq98p2#

在与jakarta配合使用的io.jsonwebtoken新版本准备就绪之前,请暂时将此类添加到您的程序中。
此类的路径必须为io.jsonwebtoken.impl

package io.jsonwebtoken.impl;

import jakarta.xml.bind.DatatypeConverter;

public class Base64Codec extends AbstractTextCodec {
    public Base64Codec() {
    }

    public String encode(byte[] data) {
        return DatatypeConverter.printBase64Binary(data);
    }

    public byte[] decode(String encoded) {
        return DatatypeConverter.parseBase64Binary(encoded);
    }
}

相关问题