繁体   English   中英

Spring @Value 注释总是评估为空?

[英]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...
}

问题是, mValuemAnotherValue始终为空......但在我的控制器中,该值被加载得很好。 是什么赋予了?

如果通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM