[英]Spring @Value annotation always evaluating as null?
所以,我有一个简单的属性文件,其中包含以下条目:
my.value=123
another.value=hello world
此属性文件正在使用PropertyPlaceHolderConfigurer
加载,它引用了上面的属性文件。
我有以下类,我正在尝试将这些属性加载到如下所示:
public class Config
{
@Value("${my.value}")
private String mValue;
@Value("${another.value}")
private String mAnotherValue;
// More below...
}
问题是, mValue
和mAnotherValue
始终为空......但在我的控制器中,该值被加载得很好。 是什么赋予了?
如果通过new
手动实例化Config
的实例,则 Spring 不会参与其中,因此注释将被忽略。
如果您无法更改代码以使 Spring 实例化 bean(可能使用prototype
范围的 bean),那么另一种选择是使用 Spring 的加载时类加载器编织功能(请参阅文档)。 这是一些低级 AOP,它允许您像往常一样实例化对象,但 Spring 将通过应用程序上下文传递它们以使它们连接、配置、初始化等。
不过,它并不适用于所有平台,因此请阅读上面的文档链接,看看它是否适合您。
我有类似的问题,但我是 Spring 的新手。 我试图将属性加载到@Service 中,并尝试使用@Value 来检索属性值...
@Autowired
public @Value("#{myProperties['myValue']}") String myValue;
我花了一整天的时间尝试各种注释组合,但它总是返回 null。 最后,答案总是在事后显而易见。
1)确保Spring通过在您的servlet.xml中包含包层次结构来扫描您的类中的注释(它将扫描您插入的基本值以下的所有内容。
2) 确保你没有“新建”你刚刚告诉 Spring 看的课程。 相反,您在 @Controller 类中使用 @Autowire。
Spring 中的一切都是单例,发生的事情是 Spring 将值加载到其单例中,然后我“新建”了另一个不包含新加载的值的类实例,因此它始终为空。
而是在@Controller 中使用...
@Autowired
private MyService service;
调试...我发现这一点所做的一件事是按如下方式扩展我的服务...
@Service
public class MyService implements InitializingBean
然后在...中放入调试语句
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
LOGGER.debug("property myValue:" + myValue);
}
在这里我可以看到初始化时设置的值,后来当我在一个方法中打印它时它是空的,所以这对我来说是一个很好的线索,它不是同一个实例。
这个错误的另一个线索是 Tomcat 抱怨超时试图从无法解析 HTTPheader 的套接字读取...这是因为 Spring 已经创建了一个服务实例,我也创建了一个实例,所以我的那个正在做真正的工作, Spring 在它的实例上超时了。
在这里查看我的答案。
我遇到了相同的症状( @Value
-annotated 字段为null
)但存在不同的潜在问题:
import com.google.api.client.util.Value;
确保您正在导入正确的@Value
注释类! 尤其是现在 IDE 的便利性,这是一个非常容易犯的错误(我使用的是 IntelliJ,如果你自动导入太快而没有阅读你正在自动导入的内容,你可能会像我一样浪费几个小时)。
正确的导入是:
org.springframework.beans.factory.annotation.Value
由于它与@Controller
一起工作,您似乎正在自己实例化Config
。 让 Spring 实例化它。
您还可以将属性设为private
,确保您的类是使用@Service
或@Component
注释的 Spring bean,以便它始终被实例化,最后添加使用@Value
注释的 setter 方法。 这确保您的属性将被分配在您的 application.properties 或 yml 配置文件中指定的值。
@Service
public class Config {
private static String myProperty;
private static String myOtherProperty;
@Value("${my.value}")
public void setMyProperty(String myValue) {
this.myProperty = myValue;}
@Value("${other.value}")
public void setMyOtherProperty(String otherValue) {
this.myOtherProperty = otherValue;}
//rest of your code...
}
将<context:spring-configured />
添加到您的应用程序上下文文件中。
然后将@Configurable
注解添加到Config
类。
在我的单元测试中,executeScenarioRequest 始终为空
@RunWith(SpringRunner.class)
@ExtendWith(MockitoExtension.class)
class ScenarioServiceTestOld {
@Value("classpath:scenario/SampleScenario.json")
Resource executeScenarioRequest;
将@ExtendWith(MockitoExtension.class)
更改为@ExtendWith(SpringExtension.class)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.