나는 내가 어떤 종류의 바보라고 확신하지만, 내 인생에서는 그것을 볼 수 없습니다.
@Value 주석을 통해 속성 주입을 광범위하게 사용하는 대규모 Spring Boot 2.1 애플리케이션이 있습니다. 이것은 훌륭하게 작동하며 수년 동안 해왔습니다. 하지만 값을 설정할 수없는 특정 새 개체가 하나 있습니다. 항상 null입니다.
동일한 값 중 일부가 다른 개체에 잘 주입되기 때문에 문제가 값 자체가 아니라는 것을 알고 있습니다. 그러나 나는이 물체에 무엇이 잘못되었는지 볼 수 없으며 당신의 눈알에 감사 할 것입니다.
이 개체의 값 (동일한 디렉터리에 있고 잘 빌드 됨)은 항상 null입니다.
@Service
public class SSOUtil {
private String domain = "https://login.microsoftonline.com/";
private String tenantId = "[deleted guid]";
public static String localEnvironment = "local";
public static String devEnvironment = "dev";
public static String testEnvironment = "test";
public static String prodEnvironment = "prod";
@Value("${actions.PROD.touchnet_azure_ad_client_secret}")
private String clientSecretTouchnetProd;
@Value("${actions.TEST.touchnet_azure_ad_client_secret}")
private String clientSecretTouchnetTest;
@Value("${actions.DEV.touchnet_azure_ad_client_secret}")
private String clientSecretTouchnetDev;
@Value("${actions.touchnet_azure_ad_client_id_dev}")
private String clientIdDev;
@Value("${actions.touchnet_azure_ad_client_id_test}")
private String clientIdTest;
@Value("${actions.touchnet_azure_ad_client_id_prod}")
private String clientIdProd;
@Value("${touchnet.redirectURLDev}")
private String redirectURLDev;
@Value("${touchnet.redirectURLTest}")
private String redirectURLTest;
@Value("${touchnet.redirectURLProd}")
private String redirectURLProd;
private String clientId;
private String clientSecret;
private String redirectURI;
public SSOUtil() {
this.redirectURI = redirectURLTest;
this.clientSecret = clientSecretTouchnetTest;
}
public String getADLoginURL() {
String returnURL = "";
System.out.println(clientIdTest); // always prints null
}
}
이 객체의 값은 잘 작동하지만 그중 하나는 다른 클래스와 동일한 @Value입니다.
@Service
public class LibraryHelpServiceBean implements LibraryHelpService {
private CourseServiceBean courseServiceBean;
private final RestTemplate restTemplate;
@Value("${actions.libraryhelp_lti_api_key}")
private String apikey;
@Value("${actions.touchnet_azure_ad_client_id_test}")
String clientIdTest;
public LibraryHelpServiceBean(CourseServiceBean courseServiceBean, RestTemplateBuilder restTemplateBuilder) {
this.courseServiceBean = courseServiceBean;
this.restTemplate = restTemplateBuilder.build();
}
public void doesValueWork() {
this.apikey = this.apikey;
System.out.println(this.clientIdTest); // always prints correct value, a guid
}
}
두 객체 모두 비슷한 방식으로 초기화됩니다. 내가 사용하는 다른 객체의 @Autowired 주석을 통해 직접 또는 간접적으로 (그리고 잘 작동하며 오랫동안 잘 작동했습니다). 다음은 SSOUtil (내 문제 클래스)의 생성입니다.
@RestController
@RequestMapping(value = "/web")
public class SSOLandingController {
@Autowired
private SSOUtil ssoUtil;
[rest of class omitted]
}
잘 작동하고 모든 @Values가 올바르게 채워지는 LibraryHelpServiceBean의 생성은 다음과 같습니다.
@Service
public class LibraryHelpStreamServiceBean implements LibraryHelpStreamService {
private LibraryHelpServiceBean libraryHelpServiceBean;
public LibraryHelpStreamServiceBean(LibraryHelpServiceBean libraryHelpServiceBean){
this.libraryHelpServiceBean = libraryHelpServiceBean;
}
}
나는 이미 SSOUtil에 대한 클래스 주석을 @Service에서 @Component로 변경하려고 시도했습니다 (그리고 @Configuration은 그저 그렇습니다).
동일한 @Values 중 일부가 다른 클래스에서 잘 채워지더라도 SSOUtil의 @Values가 null로 돌아 오는 원인은 무엇입니까?
나는 명백한 것을 놓치고 있다고 확신합니다. 오타처럼 작은 것이기를 바라고 있습니다. 지난 몇 년 동안 Spring IOC가 어떻게 작동하는지 완전히 오해 한 것처럼 그것이 큰 일이라는 것이 긴장됩니다.
당신의 도움을 주셔서 감사합니다.