【问题标题】:Spel @Value sets nullSpel @Value 设置为空
【发布时间】:2019-03-29 20:30:32
【问题描述】:

我尝试学习 SpEl,并从属性中设置对象字段值。但结果对象字段变为空。这是我的代码

配置类:

@Configuration
@ComponentScan(basePackageClasses = ExpressiveConfig.class)
@PropertySource("classpath:
/fourthversion/chapter3.placeholders/app.properties")

public class ExpressiveConfig {

@Bean
public
static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}
}

类,我尝试在其中设置字段值:

@Component
public class BlankDisc implements CompactDisc {

private String title;
private String artist;

public BlankDisc(@Value("#{systemProperties['disc.title']}") String title,
                 @Value("#{systemProperties['disc.artist']}") String artist) 
{
    this.title = title;
    this.artist = artist;

}
getters and setters
}

这是我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ExpressiveConfig.class)
public class BlankDiskTest {

@Autowired
private BlankDisc blankDisc;

@Test
public void isBlankDiscNotNull() {
    assertNotNull(blankDisc);
    System.out.println(blankDisc.getTitle());
    System.out.println(blankDisc.getArtist());
}
}

测试通过,对象不为空,但系统打印空,空 为什么没有设置字段值?

PS

如果我这样做,但这样:

public BlankDisc(@Value("${disc.title}") String title, 
@Value("${disc.artist}") String artist) {
    this.title = title;
    this.artist = artist;

}

然后一切OK。

【问题讨论】:

    标签: spring properties spring-el


    【解决方案1】:
    public BlankDisc(@Value("#{systemProperties['disc.title']}") String title,
                     @Value("#{systemProperties['disc.artist']}") String artist) 
    {
        this.title = title;
        this.artist = artist;
    
    }
    

    因为你是从系统属性中初始化数据,所以需要确保它存在

    @Test
    public void isBlankDiscNotNull() {
        assertNotNull(blankDisc);
        assertNotNull(System.getProperty("disc.title"));
        assertNotNull(System.getProperty("disc.artist"));
        assertEquals(blankDisc.getTitle(),System.getProperty("disc.title"));
        assertEquals(blankDisc.getArtist(),System.getProperty("disc.artist"));
        System.out.println(blankDisc.getTitle());
        System.out.println(blankDisc.getArtist());
    }
    

    【讨论】:

    • 在 assertNotNull(System.getProperty("disc.title")) 处测试失败;
    • 这意味着您在系统中没有任何变量。你必须设置它
    • 但是怎么做呢?为什么,当我使用@Value("${disc.artist}) 时,正如我在 PS 部分中所写的那样,一切正常?在那种情况下程序从哪里获取值?PropertySourcesPlaceholderConfigurer 在做什么?
    • docs.oracle.com/javase/tutorial/essential/environment/… ,我认为您应该首先阅读有关系统属性的信息。 #{systemProperties['disc.title']} 字符串标题,它将使用变量“disc.title”从系统中读取值并将值分配给您的变量标题。因为系统变量 disc.title 为空,所以你的变量为空。您可以研究如何初始化系统变量
    • 你是对的。我对应用程序属性和系统属性感到困惑。现在我明白了,为什么系统属性的调用返回 null。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2018-03-10
    • 2018-06-14
    相关资源
    最近更新 更多