본문 바로가기

삽질일기

[Spring] springSecurityFilterChain 관련 에러 (Java 상위 버전으로 변경시 생기는 문제)

💡 코드가 보이지 않으시다면 드래그 혹은 오른쪽 아래 🌜 아이콘을 눌러 테마 색을 변경해주세요.

 

 

안녕하세요!

키크니 개발자 입니다. 🦒

 

기존에 있는 스프링부트 1.5.3버전의 프로젝트를 2.6.2로 버전업을 하면서 생기는 문제가 있었습니다.

JAVA 버전을 8로 사용하다가 17로 변경하면서 생기는 문제였습니다.

 

에러 내용은 아래와 같았습니다.

Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

 

 

구글링해서 검색해보니 해당 글을 발견했습니다. 

그리고 위키페이지를 추천해주어 글을 살펴보았습니다.

JAXB에 관련된 글은 아래와 같았습니다.

JAXB

When upgrading you may face the following:

java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
Hibernate typically requires JAXB that’s no longer provided by default. You can add the java.xml.bind module to restore this functionality with Java9 or Java10 (even if the module is deprecated).

As of Java11, the module is not available so your only option is to add the JAXB RI (you can do that as of Java9 in place of adding the java.xml.bind module:

<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
</dependency>

Java 9 이상이 설치된 스프링 부트를 사용할 경우에는

이전에 기본적으로 제공하던 JAXB는 더이상 제공되지 않기 때문에

java.xml.bind 모듈을 추가해서 해당 기능을 사용하라는 얘기었습니다.

implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.0'
implementation 'javax.xml.bind:jaxb-api:2.4.0-b180830.0359'
implementation 'com.sun.xml.bind:jaxb-impl:4.0.0'
implementation 'com.sun.xml.bind:jaxb-core:4.0.0'

그래서 위와 같이 build.gradle에 추가하였습니다. 

하지만 아까와 같은 에러가 발생하였습니다.

추가적으로 다시 검색해보니 해당 글을 발견할 수 있었고, 더 자세한 것을 알 수 있었습니다.

 

💡 JAXB API는 JAVA EE API로 간주되므로 JAVA SE 9의 기본 클래스 경로에 더 이상 포함되지 않습니다.
JAVA 11에서는 JDK에서 완전히 제거 됩니다.
JAVA 9에는 모듈 개념이 도입되었으며 기본적으로 java.se 집계 모듈은 클래스 경로에서 사용할 수 있습니다.
이름에서 알 수 있듯이 java.se 집계 모듈에는
전통적으로 JAVA 6/7/8과 함께 번들로 제공되는 JAVA EE API가 포함 되지 않습니다.
다행히 JDK 6/7/8에서 제공되는 이러한 Java EE API는
여전히 JDK에 있지만 기본적으로 클래스 경로에 없습니다. 추가 Java EE API는 다음 모듈에서 제공됩니다.

이를 해결하려면
위에 나열된 Java EE API 모듈은 모두 Java 11 에서 제거되도록 예약되어 @Deprecated(forRemoval=true) 로 표시됩니다.
따라서 --add-module 접근 방식은 더 이상 Java 11에서 기본적으로 작동하지 않습니다.
Java 11 이상에서 수행해야 할 작업은 클래스 경로 또는 모듈 경로에 Java EE API 사본을 포함하는 것입니다.
예를 들어 다음과 같이 JAX-B API를 Maven/Gradle 종속성으로 추가 할 수 있습니다.

Maven 종속성 추가

<!-- API, java.xml.bind module -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>2.3.2</version>
</dependency>
 
<!-- Runtime, com.sun.xml.bind module -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.2</version>
</dependency>

Gradle 종속성 추가

dependencies {
    // JAX-B dependencies for JDK 9+
    implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
    implementation "org.glassfish.jaxb:jaxb-runtime:2.3.2"
}

위와 같이 종속성을 추가하니 잘 실행되었습니다.

하지만 위의 종속성도 버전을 높여서 실행시켜보면 같은 에러가 발생하여 해당 버전과 똑같이 사용하였습니다.

 

 

 

배워야 할 것이 더 많은 주니어 개발자입니다. 🐣
내용 전달보다는 정리를 목적으로 포스팅을 하고 있습니다.
잘못 된 내용이나 부족한 부분은 댓글로 주시면 감사드리겠습니다. 
반응형