반응형
문제
유레카 서버 설정을 위해 따로 EurekaServerConfig라고 하는 클래스를 만들어 실행했지만, 중복되는 빈객체로 실행이 되지 않았다.
상황
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
강의 예제에는 애플리케이션 클래스 위에 붙여주었지만, 나는 애플리케이션에 덕지덕지 @Enable- 어노테이션을 붙이는 걸 좋아하지는 않아서 따로 ~Config 클래스를 만들어주기로 했다.
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
우선 애플리케이션 클래스에서는 Enable- 어노테이션을 지워주었고,
// ./config/EurekaServerConfig.java
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableEurekaServer
public class EurekaServerConfig {
}
EurekaServerConfig.class를 만들어서 어노테이션을 붙여주었다.
2024-08-07T12:48:05.345+09:00 ERROR 89334 --- [server] [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'eurekaServerConfig', defined in class path resource [org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration$EurekaServerConfigBeanConfiguration.class], could not be registered. A bean with that name has already been defined in file [/Users/barami62/projects/adv-sparta/msa-exam-01/com.sparta.msa_exam.eureka/build/classes/java/main/com/sparta/msa_exam/eureka/config/EurekaServerConfig.class] and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
하지만 실행이 되지 않았다.
너무 길어서 줄넘김하려고 했는데 티스토리에서는 지원되지 않나 보다,,
요약하면 유레카 라이브러리의 빈 이름이랑 겹치니까 이름을 고치던지 설정을 오버라이딩 가능하도록 변경하라고 한다.
package org.springframework.cloud.netflix.eureka.server;
public class EurekaServerAutoConfiguration implements WebMvcConfigurer {
// ...
@Configuration(
proxyBeanMethods = false
)
protected static class EurekaServerConfigBeanConfiguration {
protected EurekaServerConfigBeanConfiguration() {
}
@Bean
@ConditionalOnMissingBean
public EurekaServerConfig eurekaServerConfig(EurekaClientConfig clientConfig) {
EurekaServerConfigBean server = new EurekaServerConfigBean();
if (clientConfig.shouldRegisterWithEureka()) {
server.setRegistrySyncRetries(5);
}
return server;
}
}
}
어떤 애가 우리 클래스 못 쓰게 만든건지 궁금해서 찾아보니 유레카 서버 라이브러리 속에 있었다.
그냥 이 녀석 때문에 안 된다는 것만 확인하고 넘어갔다.
해결
방법 1. 클래스 이름 변경
// ./config/CustomEurekaServerConfig.java
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableEurekaServer
public class CustomEurekaServerConfig {
}
CustomEurekaServerConfig.class 로 만들어 주었더니 정상적으로 실행이 되었다.
방법 2. 빈 오버라이딩 허용
// application.yml
...
spring:
main:
allow-bean-definition-overriding: true
...
빈이 오버라이딩 되도록 허용을 해주었다.
예상과는 다르게 정상적으로 실행되었다…
하지만 라이브로리를 가져다 쓰는 입장에서 굳이 오버라이딩했다가 어떤 일을 당할지 모르기 때문에 1번 방법을 쓰기로 했다.
반응형
'TIL' 카테고리의 다른 글
24/08/09(금) 96번째 TIL : Spring Gateway 애플 실리콘 맥 에러 (0) | 2024.08.10 |
---|---|
24/08/08(목) 95번째 TIL : Spring Data Redis 및 Redis-cli 문자열 인코딩 방식 (2) | 2024.08.09 |
24/08/06(화) 93번째 TIL : 도커 볼륨으로 레디스 데이터 공유하기 (3) | 2024.08.06 |
24/08/05(월) 92번째 TIL : 레디스 인증 설정 (0) | 2024.08.05 |
24/08/02(금) 91번째 TIL : EC2 Ubuntu 포트포워딩 (0) | 2024.08.02 |