java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter in Java 17 — [Solved]

Jiri Caga
2 min readOct 13, 2023

--

Issue

When using Jwts.builder() from package io.jsonwebtoken in application, the following error appear in the log:

Error

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:525) ~[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.example.cafemanagementsystem.config.security.JwtUtil.createToken(JwtUtil.java:52) ~[classes/:na]
at com.example.cafemanagementsystem.config.security.JwtUtil.generateToken(JwtUtil.java:43) ~[classes/:na]
at com.example.cafemanagementsystem.service.impl.UserServiceImpl.login(UserServiceImpl.java:74) ~[classes/:na]
at com.example.cafemanagementsystem.controller.UserController.login(UserController.java:40) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

Environment

OperationSystem: Ubuntu 20.04
Language: Java 17
Database: MySQL 8.0.28
Frameworks:
Spring Boot 3.1.3

Analysis

In Java 11 or higher, JAXB has been removed from JDK (together with other JEE related modules based on JEP 320) and we need to add it to the project as a separate library via Maven or Gradle.

Solutions

You can resolve this error by adding the JAXB module to your project’s dependencies. For example, if using Maven, add the following dependency to your pom.xml file:

<dependencies>
<!-- Other dependencies -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>

Can I still use JAXB in Java 11 or higher?

You can still use JAXB in Java 11 by adding it as a separate module or dependency to your project.

What are the alternatives to JAXB in Java 11?

Alternatives to JAXB in Java 11 include using other XML binding frameworks such as Jackson or XMLBeans, or manually parsing XML using the built-in XML parsing capabilities of Java.

Resources

--

--

Jiri Caga

Freelance Java Developer focusing on support/development backend enterprise applications in fintech area.