Spring Framework 6.0.9 에서 6.1.1로 단순 디펜던시만 변경하여 구동할 경우 실행이 되지 않는 현상이 발생했다.
일단 모든 디펜던시를 최신버전(Latest)로 변경하면 어찌어찌 구동은 되는 걸 확인할 수 있지만, 결국 에러메시지가 뜨면서 막히게 된다.
이때 마주하게 되는 에러메세지는 Bean등록한 것 들 중에 Return Type이 String인 경우 다 오류로 뱉어낸다.
전면적으로 String 반환을 쓰지 않는다는 가정하에, 인스턴스 객체로 만들어 처리하면 넘어가겠지만 이후 각 컨트롤러에 명시되어 있는 파라미터 타입 부분에서 이슈가 발생한다.
대략 에러 메세지의 내용은 이러하다.
No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Error creating bean with name 어쩌구 : Unsatisfied dependency expressed through field 어쩌구
최대한 관련이 있을 법한 부분을 수정하면서 해결방안을 찾아내 블로그에 공유한다.
시도
maven pom.xml 내 <build><plugins> 안쪽에 있다면 수정, 없다면 추가해야 한다.
아마 기본적인 maven-compiler-plugin만 있을 가능성이 높다.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.14.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<source>16</source> <!-- Java 버전에 맞게 수정 -->
<target>16</target> <!-- Java 버전에 맞게 수정 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
AspectJ 쪽에서 Configuration을 17로 잡고 싶었지만, 아쉽게도 16까지만 지원한다.
Maven compiler plugin 내에 아래와 같은 옵션을 넣어야 한다 하여 아래와 같이 추가했다.
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
그리고 실행했더니, 잘 된다...
다만, 여기서 문제가 있는데, [aspectj-maven-plugin] 은 이 문제를 근본적으로 해결해 주는 역할이 아닌데도 해당 플러그인을 사용해야 정상작동했다는 것도 있겠지만 사실 해당 플러그인의 경우 더 이상 개발자가 개발을 진행하지 않는다.
2021년까지만 반영되어 있다. 그래서 자바 16까지만 지원됐던 것 같다.
보안 이슈도 있는 것으로 확인 됐다.
결국 성공해도 이건 성공한 게 아니다.
분명 스프링 공식문서 내에 해결방법이 있을 것이다.
찾아보았다.
그리고 얼마 지나지 않아 찾아냈다.
해결
MAVEN
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<parameters>true</parameters>
</configuration>
</plugin>
Maven의 경우 CompilerArgs 가 아닌, <parateters> true </parameters>를 통해 설정해 주면 된다.
Maven이 아닌 경우 아래와 같이 설정한다.
GRADLE
tasks.withType<JavaCompile>(){
options.compilerArgs.add("-parameters")
}
GROOBY
tasks.withType(JavaCompile).configureEach {
options.compilerArgs.add("-parameters")
}
본인 IDE에서 잘 동작이 안 되는 경우 아래와 같이 IDE자체에 설정할 수 도 있다.
인텔리J
IntelliJ IDEA -> Settings 추가.
- 빌드, 실행, 배포 → 컴파일러 → Java 컴파일러 → 추가 명령줄 매개변수 (-parameters 추가)
이클립스
Eclipse IDE에서 Preferences다음 확인란
Java → 컴파일러 → 메소드 매개변수에 대한 정보 저장(리플렉션을 통해 사용 가능)
'자바 > Spring Framework' 카테고리의 다른 글
RabbitMQ Request Reply 패턴 (0) | 2024.04.22 |
---|---|
Spring Framework 6 RabbitMQ no queue in vhost 이슈 해결 (0) | 2024.03.13 |
lucy-xss-servlet-filter Spring 6 용 JAR 빌드/적용 (2) (0) | 2023.08.17 |
lucy-xss-servlet-filter Spring 6 용 JAR 빌드/적용 (1) (2) | 2023.08.17 |