@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 文件夹得到解决。
我很确定我是个白痴,但我这辈子都看不出来。
我有一个大型 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 文件夹得到解决。