티스토리 뷰

728x90

 

 

 

메세지 전송 컨트롤러에 생성자 함수를 구현하던 중 오류가 발생했다.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSendController' defined in file
...
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.potato.message.send.controller.MessageSendController]: Constructor threw exception
...
Caused by: java.lang.NullPointerException: Parameter specified as non-null is null:
...

 

 

기존 코드를 보면,

@Value 어노테이션으로 Spring 환경 변수에서 주입되는 API_KEY, API_SECRET_KEY 속성을 지정하고

생성자는 해당 값으로 새로운 인스턴스를 제공 받도록 구현했다.

@Value("${API_KEY}") private String API_KEY; 
@Value("${API_SECRET_KEY}") private String API_SECRET_KEY;

public MessageSendController() {
    this.messageService = NurigoApp.INSTANCE.initialize(API_KEY, API_SECRET_KEY, "https://...");
}

 

여기서 문제는 @Value로 해당 값이 주입되기 전에 인스턴스를 제공 받는 부분이 실행 되면서,

API_KEY, API_SECRET_KEY 부분이 null이 되어 오류가 발생했다.

 

728x90

 

그래서 생성자 대신 @PostConstruct 어노테이션을 활용하여 코드를 수정했다.

@Value("${API_KEY}") private String API_KEY; 
@Value("${API_SECRET_KEY}") private String API_SECRET_KEY;

// 수정된 부분
@PostConstruct
public void init() {
	this.messageService = NurigoApp.INSTANCE.initialize(API_KEY, API_SECRET_KEY, "https://...");
}

 

 

이 방식으로 실행하면 @Value의 값이 주입된 이후 init() 메서드가 실행되면서 messageService가 정상적으로 초기화된다.

 

 

 

 

아래 코드처럼 @Autowired 어노테이션을 사용하여 구성하는 방식도 있지만,

@PostConstruct를 사용하여 값이 완전히 주입된 후 초기화하는 방식이 더 안정적이라고 생각해서 이 방식은 사용하지 않았다.

@Autowired
public MessageSendController(@Value("${API_KEY}") String API_KEY, 
			@Value("${API_SECRET_KEY}") String API_SECRET_KEY) {
    this.messageService = NurigoApp.INSTANCE.initialize(API_KEY, API_SECRET_KEY, "https:...");
}

 

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크