带Spring Boot的嵌入式Tomcat JNDI映射

时间:2015-02-17 10:30:47

标签: glassfish spring-boot jndi embedded-tomcat-8

我们正在使用Glassfish,我们在其中设置Map类型的JNDI资源,我们定义了一些Bean工厂,之后我们可以在代码中访问(JNDI查找)这个地图。

我想对使用Spring Boot的嵌入式Tomcat测试做同样的事情,但我不知道如何。它们到处都是引用如何添加JNDI数据源而不是某些Hashmap。我试过这样的事情,但我的猜测是完全错误的。

public TomcatEmbeddedServletContainerFactory tomcatFactory() {
     return new TomcatEmbeddedServletContainerFactory() {

        @Override
        protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
                Tomcat tomcat) {
            tomcat.enableNaming();
            return super.getTomcatEmbeddedServletContainer(tomcat);
        }
            @Override
            protected void postProcessContext(Context context) {
                ContextResource resource = new ContextResource();
                resource.setName("jndiname");
                resource.setType(Map.class.getName());
                // for testing only
                resource.setProperty("testproperty", "10");

                context.getNamingResources().addResource(resource);
            }
        };
    }


    @Bean(destroyMethod="")
    public Map jndiDataSource() throws IllegalArgumentException, NamingException {
        JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
        bean.setJndiName("jndiname");
        bean.setProxyInterface(Map.class);
        bean.setLookupOnStartup(false);
        bean.setResourceRef(true);
        bean.afterPropertiesSet();
        return (Map)bean.getObject();
    }

我不知道在Object工厂中传递的位置。是否可以使用嵌入式Tomcat?

1 个答案:

答案 0 :(得分:0)

首先要做的是创建一个可以返回ObjectFactory的{​​{1}}实现:

Map

然后使用public class MapObjectFactory implements ObjectFactory { @Override public Object getObjectInstance(Object obj, Name name, javax.naming.Context nameCtx, Hashtable<?, ?> environment) throws Exception { Map<String, String> map = new HashMap<String, String>(); // Configure the map as appropriate return map; } } 上的ObjectFactory属性配置factory

ContextResource