到目前为止,我一直在使用Spring 4.0.8,以下工作正常:
在我的单元测试中,我在jndi环境中输入了一个值:
SimpleNamingContextBuilder _simpleNamingContextBuilder =
new SimpleNamingContextBuilder();
_simpleNamingContextBuilder.bind(
"java:comp/env/myBoolVar", true);
_simpleNamingContextBuilder.activate();
然后在我的课堂上,我这样访问它:
@Value("#{environment.myBoolVar}")
private Boolean _myBoolVar = Boolean.FALSE;
我已升级到Spring 4.1.2,这已不再适用。始终使用默认值false,因为Spring无法找到该值。
如果我使用旧方式访问此值:
@Resource(mappedName = "java:comp/env/myBoolVar")
它确实有用。
我一直在搜索SO和网络,我已经看到了大量的信息,但没有人帮助我解决问题。我的理解是Spring Environment可以访问@Value所做的所有值。所以我不确定问题是什么。
答案 0 :(得分:0)
基本上发生的事情是,在启动时,Spring尝试在StandardServletEnvironment.customizePropertySources()方法中理清它具有的PropertySources。当需要查找jndiProperties时,它会执行以下操作:
if(JndiLocatorDelegate.isDefaultJndiEnvironmentAvailable()) {
propertySources.addLast(new JndiPropertySource("jndiProperties"));
}
该方法,JndiLocatorDelegate.isDefaultJndiEnvironmentAvailable(),执行以下操作:
try {
new InitialContext().getEnvironment();
return true;
}
catch (Throwable ex) {
return false;
}
在我的情况下,对getEnvironment()的调用抛出NoInitialContextException:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
这阻止了Spring创建jndiProperties PropertySource,因此我的boolean var丢失了。
所以我开始在网上查看为什么会发生这种情况......但后来在Spring论坛上发现old article说这会将我的代码放在@BeforeClass块中,等等。
我希望这能在未来的某个时候为某人带来一些痛苦和痛苦。