0

到目前为止,我一直在使用 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 所做的所有值。所以我不确定问题是什么。

4

1 回答 1

0

仅供任何在这方面苦苦挣扎的人。最后,我将添加“myBoolVar”值到 SimpleNamingContextBuilder 的代码放在带有 @BeforeClass 注释的方法中,现在它工作正常。

基本上发生的事情是,在启动时,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,因此我的布尔变量迷路了。

所以我开始在网上寻找为什么会发生这种情况......但后来在 Spring 论坛上发现了一篇旧文章,说这将我的代码放在了 @BeforeClass 块中,等等。

我希望这可以在将来的某个时候为某人节省一些痛苦和痛苦。

于 2018-01-29T12:37:42.617 回答