MongoDb通过jndi

你知道是否有可能像jndi的数据源一样在spring中设置mongodb实例?

谢谢

如果你的意思是像常规的RDBMS与JDBC访问,那么答案是否定的。

是的,有可能,为什么在你可以创建自己的JNDI工厂时依赖别人的代码呢? 只需创建一个实现javax.naming.spi.ObjectFactory的类和一个从JNDI上下文中提取mongo的bean,我将其配置为spring data-mongo MongoTemplate对象。

public class CustomMongoJNDIFactory implements ObjectFactory { public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception { validateProperty(obj, "Invalid JNDI object reference"); MongoTemplate mongoTemplate = null; String db = null; String host = null; String username = null; String password = null; int port = 27017; Reference ref = (Reference) obj; Enumeration props = ref.getAll(); while (props.hasMoreElements()) { RefAddr addr = (RefAddr) props.nextElement(); String propName = addr.getType(); String propValue = (String) addr.getContent(); if (propName.equals("db")) { db = propValue; } else if (propName.equals("host")) { host = propValue; } else if (propName.equals("username")) { username = propValue; } else if (propName.equals("password")) { password = propValue; } else if (name.equals("port")) { try { port = Integer.parseInt(propValue); } catch (NumberFormatException e) { throw new NamingException("Invalid port value " + propValue); } } } // validate properties validateProperty(db, "Invalid or empty mongo database name"); validateProperty(host, "Invalid or empty mongo host"); validateProperty(username, "Invalid or empty mongo username"); validateProperty(password, "Invalid or empty mongo password"); //create mongo template mongoTemplate = new MongoTemplate(new Mongo(host, port), db, new UserCredentials(username, password)); return mongoTemplate; } /** * Validate internal String properties * * @param property * @param errorMessage * @throws NamingException */ private void validateProperty(String property, String errorMessage) throws NamingException { if (property == null || property.trim().equals("")) { throw new NamingException(errorMessage); } } /** * Validate internal Object properties * * @param property * @param errorMessage * @throws NamingException */ private void validateProperty(Object property, String errorMessage) throws NamingException { if (property == null) { throw new NamingException(errorMessage); } } 

}

春豆:

 @Configuration @Qualifier("mongoTemplate") public class CustomMongoTemplate { public @Bean MongoTemplate mongoTemplate() throws Exception { Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); return (MongoTemplate) envCtx.lookup("bean/MyMongoBean"); } } 

context.xml中:

  

在web.xml

   Mongo JNDI configuration comp/env/bean/MyMongoBean org.springframework.data.mongodb.core.MongoTemplate  

重用Juan Melo的ObjectFactory接口( CustomMongoJNDIFactory )的自定义实现,它也可以使用Spring的jee命名空间的jndi-lookup标签和context.xml file相应的Tomcat配置进行配置,如下所示:

spring-mongodb-persistence-context.xml

     

context.xml

  

为此,您需要一个用于MongoDB的JDBC驱动程序impl。 我只发现了一个,它在MongoDB页面中被称为“实验性的”:MongoDB的GitHub JDBC驱动程序 。

为了解决这个限制,您可以设置一些Spring bean并为您的应用程序DAO创建一个MongoDB实现(这样,您就不需要更改DAO接口及其客户端组件)。

本文可能有所帮助:

  • 简单的MongoDB Spring集成
  • 将Spring / Hibernate应用程序迁移到MongoDB

还有另一项努力为MongoDB提供JDBC驱动程序impl。 这里:

https://sourceforge.net/projects/mongojdbcdriver

无论如何都不完整,但希望能够提供Java开发人员很快熟悉的JDBC实现。