我很肯定我是个白痴,但我一辈子都看不出来。
我有一个大型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中的一些在其他类中填充得很好?
我确信我遗漏了一些明显的东西。我希望是个小问题,比如打字错误。我很紧张,这是件大事,就像我完全误解了过去几年国际奥委会的工作方式一样。
谢谢你的帮助。
1条答案
按热度按时间yeotifhr1#
我在我的电脑上测试了你的案例,但我无法重现你的问题。当这样的事情发生时,试着做一些非常简单的事情
将此组件注入控制器,在控制器方法内设置断点并检查注入的示例。
我的经验是,一些无法解释的案件,我已经在这里参与,所以,解决了清洁建设或擦拭.m2文件夹。