【问题标题】:Getting exception java.lang.NoClassDefFoundError: Could not initialize class javax.xml.bind.DatatypeConverterImpl获取异常 java.lang.NoClassDefFoundError: 无法初始化类 javax.xml.bind.DatatypeConverterImpl
【发布时间】:2019-08-31 13:20:55
【问题描述】:

在实现 Jwt Spring Security 实现时出现以下异常:

java.lang.NoClassDefFoundError: 无法初始化类 javax.xml.bind.DatatypeConverterImpl .

在 Spring Boot 项目中

pom.xml 中的依赖如下:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- For Working with Json Web Tokens (JWT) -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!-- marked the embedded servlet container as provided -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>2.6.0</version>
    </dependency>
    <!-- hot swapping, disable cache for template, enable live reload -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>1.3.3.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <!-- Optional, for bootstrap -->
    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>bootstrap</artifactId>
        <version>3.3.7</version>
    </dependency>

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <scope>compile</scope>
        <version>1.0</version>
    </dependency>
    
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>org.modelmapper</groupId>
        <artifactId>modelmapper</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j</artifactId>
        <version>1.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.7</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20180813</version>
    </dependency>

</dependencies>

详细的引导如下:

Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: 
Could not initialize class javax.xml.bind.DatatypeConverterImpl
] with root cause
java.lang.NoClassDefFoundError: Could not initialize class javax.xml.bind.DatatypeConverterImpl
    at javax.xml.bind.DatatypeConverter.initConverter(Unknown Source)
    at javax.xml.bind.DatatypeConverter.parseBase64Binary(Unknown Source)
    at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26)
    at io.jsonwebtoken.impl.DefaultJwtBuilder.signWith(DefaultJwtBuilder.java:99)
    at com.mpcz.services.jwt.security.JwtTokenUtil.generateToken(JwtTokenUtil.java:92)
    at com.mpcz.services.jwt.security.JwtTokenUtil.generateToken(JwtTokenUtil.java:85)
    at com.mpcz.services.controller.ConsumerLoginController.register(ConsumerLoginController.java:183)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

在下面提到的代码中生成 JWT 令牌时出现上述错误:

Jwts.builder().setClaims(claims).setExpiration(generateExpirationDate()).signWith(SignatureAlgorithm.HS512, secret).compact();

【问题讨论】:

  • 我找到了解决上述问题的方法:在 pom.xml 中添加以下内容
  • javax.xml.bindjaxb-api2.1
  • 还下载了Xercesxml 2.12.0版本并添加到pom.xml中
  • 您应该添加一个干净的响应并接受它。这是我找到这个(完美工作)解决方案的唯一地方,谢谢。
  • @Giggs 谢谢你的解决方案!

标签: spring-security jwt


【解决方案1】:

为了将来参考,解决方案是添加以下依赖项以避免 java 11 问题:

对于 Maven 项目:

<dependency> 
    <groupId>javax.xml.bind</groupId> 
    <artifactId>jaxb-api</artifactId>
    <version>2.1</version>
</dependency>

对于 gradle 项目:

compile 'javax.xml.bind:jaxb-api:2.1'

感谢@Giggs

【讨论】:

    【解决方案2】:

    添加 JAXB API 依赖解决了我的问题。

    <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
    
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    

    【讨论】:

      【解决方案3】:

      在使用 OpenJDK 11 时,这对我来说也很好用。无需任何代码修改。

      我在前端类上使用 java.base.* enc/dec 而不是 javax.xml.bind.DatatypeConverter,但 jjwt (0.9.0) 在生成令牌时将其重新引入。

      您的解决方案很好,不必将 Xercesxml 添加到我的 pom.xml 中,可能是因为我只是在做基本的 jwt。

      问候,

      德兹曼!

      【讨论】:

        【解决方案4】:

        是的,对我来说,添加 javax api 依赖项修复了我的错误。

        compile 'javax.xml.bind:jaxb-api:2.1'
        

        谢谢@Andrei

        【讨论】:

          【解决方案5】:

          将此依赖项添加到 pom 文件对我有用:

          <dependency>
              <groupId>javax.xml.bind</groupId>
              <artifactId>jaxb-api</artifactId>
              <version>2.3.1</version><!--$NO-MVN-MAN-VER$-->
          </dependency>
          

          【讨论】:

            猜你喜欢
            • 2019-07-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-10
            • 1970-01-01
            相关资源
            最近更新 更多