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实现。