-
[Spring] Error - Parameter 0 of constructor in ~ required a bean of type 'java.lang....' that could not be found.스프링 2023. 12. 29. 01:02
해당 에러를 찾아보니까 다양한 타입이 나왔었다.
필자같은 경우는 java.lang.long에 대한 에러가 발생하였다.
에러 내용들을 상세히 해석해보자면 해당 클래스의 생성자 매개변수는 long타입의 bean이 필요한데,
찾지 못한다 라는 것이다.
@Value("${jwt.live.atk}") private final long ACCESS_PERIOD; @Value("${jwt.live.rtk}") private final long REFRESH_PERIOD;
필드 매개변수의 존재하는 문제의 코드는 다음과 같다.
해당 매개변수는 @RequiredArgsConstructor를 사용하고 있다.
final을 사용하기 때문에 해당 필드에 대해 생성자가 만들어져 의존성이 주입이 된다.
그러나 해당 변수들은 기본타입의 변수이고, SpringContainer가 관리하는 Bean이 아니가.
따라서 의존성 주입이 불가능하므로 에러가 발생하는 것이다.
그러나 해당 변수는 @Value에 의해 application.yml에서 값을 받고 있다.
@Value는 Spring이 빈 생성 이후에 값을 주입을 시도하는데, 이 시점에 이미 final변수는 초기화가 되어있어야하므로 문제가 발생한다. 따라서 application파일에서 값을 주입받으려면 final키워드를 제거해야 한다.
만약 final을 유지하려고 한다면??
다음과 같이 생성자 주입을 사용할 수 있다.
@Component public class MyComponent { private final String myValue; public MyComponent(@Value("${my.value}") String myValue) { this.myValue = myValue; } // ... }
728x90'스프링' 카테고리의 다른 글
빈 등록과 주입을 아라보자 (1) 2024.05.15 [Spring] springBoot2.4 이상에서의 application설정 (0) 2023.12.29 [JUnit5] @ParameterizedTest, @ValueSource, @CsvSource (0) 2023.11.01 Service계층의 의존 (0) 2023.08.30 mocking 아규먼트 불일치 (0) 2023.07.30