Spring 4.1x,SimpleNamingContextBuilder和@Value(“#{environment.xxx}”)

时间:2018-01-26 13:03:51

标签: spring-mvc jndi propertyconfigurator

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

1 个答案:

答案 0 :(得分:0)

对于那些在这里挣扎的人来说,仅供参考。最后,我将带有“myBoolVar”值的代码放在带有@BeforeClass注释的方法中的SimpleNamingContextBuilder中,现在它可以正常工作。

基本上发生的事情是,在启动时,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块中,等等。

我希望这能在未来的某个时候为某人带来一些痛苦和痛苦。