@Value 未在一个特定的 class 中设置

@Value not set in one specific class

我很确定我是个白痴,但我这辈子都看不出来。

我有一个大型 Spring Boot 2.1 应用程序,它通过 @Value 注释广泛使用属性注入。这很好用,已经做了很多年了。但是有一个特定的全新对象,我无法在其中设置值。它们始终为空。

我知道问题不在于值本身,因为一些相同的值可以很好地注入其他对象。但是我就是看不出THIS这个对象有什么问题,希望大家多多指教。

这个对象中的值(它在同一个目录中并且构建得很好)总是空的:

@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 相同class:

@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 的创建(我的问题 class):

@RestController
@RequestMapping(value = "/web")
public class SSOLandingController {

    @Autowired
    private SSOUtil ssoUtil;

 [rest of class omitted]
}

下面是 LibraryHelpServiceBean 的创建,它工作正常并且所有 @Values 都正确填充:

@Service
public class LibraryHelpStreamServiceBean implements LibraryHelpStreamService {

    private LibraryHelpServiceBean libraryHelpServiceBean;
    
    public LibraryHelpStreamServiceBean(LibraryHelpServiceBean libraryHelpServiceBean){
         this.libraryHelpServiceBean = libraryHelpServiceBean;
    }
}

我已经尝试将 SSOUtil 的 class 注释从 @Service 更改为 @Component(和 @Configuration,只是为了它)。

是什么导致 SSOUtil 中的 @Values 返回 null,即使其中一些相同的 @Values 在其他 classes 中填充得很好?

我确信我遗漏了一些明显的东西。我希望这是一个小错误,比如打字错误。我很紧张,这是一件大事,就像我完全误解了 Spring 国际奥委会过去几年的运作方式一样。

感谢您的帮助。

我在我的电脑上测试了你的案例,但我无法重现你的问题。当这样的事情发生时,尝试像这样非常简单的事情

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;
 }

将此组件注入您的控制器,在您的控制器方法中设置断点并检查注入的实例。

我的经验是,我在 SO 上遇到的一些无法解释的案例已通过清理构建或擦除 .m2 文件夹得到解决。