簡體   English   中英

java.lang.NoClassDefFoundError:使用 Java 11 解碼 JWT 令牌時的 javax/xml/bind/DatatypeConverter

[英]java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter while decoding JWT token with Java 11

當調用此方法解碼 JWT 令牌 javax.xml.bind.DatatypeConverter.parseBase64Binary(encoded) 時,出現此異常:

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。

我在項目上使用 Java 11 和 spring 啟動。

謝謝您的幫助。

在 gradle 中添加這一行。

實現'javax.xml.bind:jaxb-api:2.4.0-b180830.0359'

使用特定版本降級您的javax.xml.bind:jaxb-api

現在將此 class 添加到您的程序中,直到准備好與jakarta一起使用的新版本io.jsonwebtoken

這個class的路徑一定是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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM