@Values 未在特定类中设置

nfeuvbwi  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(222)

我很肯定我是个白痴,但我一辈子都看不出来。
我有一个大型springboot2.1应用程序,它通过@value注解广泛地使用属性注入。这工作很好,已经做了很多年了。但是有一个特殊的,全新的对象,我无法设置值。它们总是空的。
我知道问题不在于值本身,因为一些相同的值可以很好地注入到其他对象中。但我就是看不出这个东西有什么问题,我很感激你的眼球。
此对象中的值(位于同一目录中,构建得很好)始终为空:

@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]
}

下面是libraryhelpservicebean的创建,它运行良好,所有@values都正确填充:

@Service
public class LibraryHelpStreamServiceBean implements LibraryHelpStreamService {

    private LibraryHelpServiceBean libraryHelpServiceBean;

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

我已经尝试过将ssoutil的类注解从@service改为@component(还有@configuration,只是为了见鬼)。
是什么导致ssoutil中的@value返回null,即使这些@value中的一些在其他类中填充得很好?
我确信我遗漏了一些明显的东西。我希望是个小问题,比如打字错误。我很紧张,这是件大事,就像我完全误解了过去几年国际奥委会的工作方式一样。
谢谢你的帮助。

yeotifhr

yeotifhr1#

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

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文件夹。

相关问题