카테고리 없음

@Value가 하나의 특정 클래스에 설정되지 않았습니다.

기록만이살길 2021. 2. 23. 10:09
반응형

@Value가 하나의 특정 클래스에 설정되지 않았습니다.

1. 질문(문제점):

나는 내가 어떤 종류의 바보라고 확신하지만, 내 인생에서는 그것을 볼 수 없습니다.

@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가 어떻게 작동하는지 완전히 오해 한 것처럼 그것이 큰 일이라는 것이 긴장됩니다.

당신의 도움을 주셔서 감사합니다.

2. 해결방안:

내 컴퓨터에서 케이스를 테스트했지만 문제를 재현 할 수 없습니다. 이런 일이 일어나면 이렇게 아주 간단한 것을 시도해보세요

package no.mycompany.springbootapp;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

 @Component
 public class SSOUtil2 {
    @Value("${actions.touchnet_azure_ad_client_id_test}")
    private String clientIdTest;
 }

이 구성 요소를 컨트롤러에 삽입하고 컨트롤러 메서드 내부에 중단 점을 설정하고 삽입 된 인스턴스를 검사합니다.

내 경험에 따르면 내가 여기에 참여한 설명 할 수없는 일부 사례는 빌드를 청소하거나 .m2 폴더를 삭제하여 해결되었습니다.

65837267
반응형