0

我们正在使用 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();
    }

我不知道在对象工厂中传递到哪里。嵌入式Tomcat有可能吗?

4

1 回答 1

0

首先要做的是创建一个ObjectFactory可以返回 a 的实现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

@Override
protected void postProcessContext(Context context) {
    ContextResource resource = new ContextResource();
    resource.setName("foo/myMap");
    resource.setType(Map.class.getName());
    resource.setProperty("factory", MapObjectFactory.class.getName());
    context.getNamingResources().addResource(resource);
}
于 2015-02-17T13:57:10.417 回答