@Value( "${model.version:2}" ) 未占用默认值 = 2



我有一个spring应用程序,我在其中放入了如下代码,并传递mvn参数来更新值。问题是每次我传递值时,不管默认情况下它取的值是0。你能帮我解决这个问题吗。

这是我的小代码片段

@Value("${model.version:2}")
private int model;
public test class(){
if(model == 2){
<some logic>
}
}

使用mvn参数作为-Dmodel.version=2

简而言之:您没有使用spring管理的上下文

让我们一起走过这一关。

假设类MyCoolClass类似:

@Component
public class MyCoolClass {
@Value("${some.value:3}")
private int a;
public void show() {
log.info("a is " + a);
}
}

如果你自动连线并调用show((,它会记录

a是3

现在让我们创建一个测试来验证它是否真的有效:

@SpringBootTest
public class MyTest {
@Autowired
private MyCoolClass myCoolClass;
@Test
public void lookAtMe() {
myCoolClass.show();
}
}

这最初抛出一个NPE,因为this.myCoolClass为null;关于某件事情不能正常工作的第一个提示。让我们克服这个问题,在自己身上安装myCoolClass

this.myCoolClass = new MyCoolClass();
this.myCoolClass.show()

a是0

这里的线索是,如果您自己创建一个MyCoolClass实例,那么没有人会为您解析@Value注释并处理表达式。这只是一个普通的POJO。

为了解决这个问题,将@RunWith(SpringJUnit4ClassRunner.class)添加到类中,并设置viola,日志运行整个Spring应用程序启动并记录a is 3!(当然没有用户创建的构造函数调用(:

@SpringBootTest
@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
public class mytest {
@Autowired
private MyCoolClass myCoolClass;
@Test
public void lookAtMe() {
myCoolClass.show();
}
}

这就是日志的样子:

.   ____          _            __ _ _
/\ / ___'_ __ _ _(_)_ __  __ _    
( ( )___ | '_ | '_| | '_ / _` |    
\/  ___)| |_)| | | | | || (_| |  ) ) ) )
'  |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::       (v2.1.13.RELEASE)
12:41:59  INFO 912 --- [      main] com.example.demo.MyTest                 : Starting MyTest on clijsters-computer with PID 912 (started by dclijsters in C:demo)
12:41:59  INFO 912 --- [      main] com.example.demo.MyTest                 : No active profile set, falling back to default profiles: default
12:42:01  INFO 912 --- [      main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
12:42:02  INFO 912 --- [      main] o.s.s.c.ThreadPoolTaskScheduler         : Initializing ExecutorService 'taskScheduler'
12:42:02  INFO 912 --- [      main] com.example.demo.MyTest                 : Started MyTest in 2.513 seconds (JVM running for 3.376)
12:42:02  INFO 912 --- [      main] com.example.demo.MyTest                 : a is 3
12:42:02  INFO 912 --- [  Thread-3] o.s.s.c.ThreadPoolTaskScheduler         : Shutting down ExecutorService 'taskScheduler'
12:42:02  INFO 912 --- [  Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'

最新更新