@Value注释始终返回null

时间:2017-05-02 08:53:14

标签: java spring maven spring-boot annotations

我正在尝试使用@Value注释读取application.properties文件中的内容。但它总会返回null。

**Sample Java code**

    @Component    
    public class SampleClass() implements Runnable{
        @Value("${profile.name}")
        private String name;
    
        @Override
        public void run(){
            System.out.println("Name: " + name);
            ...
        }
    }

**Application.properties**

    profile.name=myname

**Pom.xml**

    <profiles>
    	<profile>
    		<id>dev</id>
    		<properties>
    			<activatedProperties>dev</activatedProperties>
    		</properties>
    	</profile>
    	<profile>
    		<id>stag</id>
    		<properties>
    			<activatedProperties>stag</activatedProperties>
    		</properties>
    	</profile>
    	<profile>
    		<id>prod</id>
    		<properties>
    			<activatedProperties>prod</activatedProperties>
    		</properties>
    	</profile>
    </profiles>
    ....
    <build>
        <resources>
            <resource>
        		<directory>src/main/resources</directory>
        		<filtering>true</filtering>
        		<includes>
        			<include>**/*.properties</include>
        		</includes>
        	</resource>
        </resources>
    </build>

我甚至试过给变量一个默认值,它仍然返回null。

@Value("${profile.name:'samplename'}")

为什么?

更新

我设法现在在SampleClass()中检索profile.name值。但我不确定我的方式是否正确。 SampleClass1将调用SampleClass2。

示例Java 1代码

@Component    
public class SampleClass1(){
    @Autowired
    SampleClass2 sampleClass2;

    @Value("${profile.name}")
    private String profileName;

    sampleClass2.setName(profileName);
    //Invoke SampleClass2
}

示例Java 2代码

@Component    
public class SampleClass2() implements Runnable{
    private String profileName;

    public void setName(String profileName){
        this.profileName= profileName;
    }
    @Override
    public void run(){
        System.out.println("Name: " + profileName);
        ...
    }
}

3 个答案:

答案 0 :(得分:0)

您的SampleClass必须是Bean。为您的班级添加注释,例如@Component让Spring在扫描期间找到它并分配值。

答案 1 :(得分:0)

要清楚。

48 48 48 48 87 50 48
 0  0  0  0  w  2  0

在application.properties

@Component
@Getter
public class SampleComponentClass {

  @Value("${profile.name}")
  private String profileName;

}

@Component
Class SomeOtherClass{
    @Autowired
     SampleComponentClass sampleComponentClass;

    public void someMethod(){
     System.out.println(sampleComponentClass.getProfileName()); // prints testprofile
     SampleComponentClass sampleComponentClass1 = new SampleComponentClass();
     System.out.println(sampleComponentClass1.getProfileName()); // prints null
    }
}

答案 2 :(得分:0)

在配置类中注入值并使用自动装配注释使用此组件的实例可能是更好的方法。

@Configuration
public class SomeConfig {
    @Value("${profile.name}")
    private String profileName;

    @Bean
    public SampleClass1 sampleClass1(){
        SampleClass1 sampleClass1 = new Sampleclass1();
        // This approach, you can make additional control and configuration here 
        sampleClass1.setProfileName(profileName);
        return sampleClass1;
    }
    @Bean
    public SampleClass2 sampleClass2(){
        return new SampleClass2();
    }
}

无论您需要SampleClass1

public class SomeClass{
    @Autowired
    private SampleClass1 sampleClass1;
}