2010-11-02 233 views

回答

0

如果你的意思是像JDBC訪問常規的RDBMS,那麼答案是否定的。

2

要做到這一點,您需要一個適用於MongoDB的JDBC驅動程序impl。我只找到了一個,它從MongoDB頁面被稱爲「實驗」:GitHub JDBC Driver for MongoDB

to workaroud this limit,you can setup some Spring beans and create a MongoDB implementation for your application DAO(這樣,你不需要改變DAO接口和它的客戶端組件)。

此文章可以幫助:

11

是的,它是可能的,爲什麼有人依靠別人的代碼時,你可以創建自己的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<RefAddr> 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); 
    } 
} 

}

的Spring bean:

@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:

<Resource name="bean/MyMongoBean" auth="Container" 
     type="org.springframework.data.mongodb.core.MongoTemplate" 
     factory="com.package.CustomMongoJNDIFactory" 
     host="" db="" username="" password=""/> 

的web.xml

<resource-env-ref> 
    <description>Mongo JNDI configuration</description> 
    <resource-env-ref-name>comp/env/bean/MyMongoBean</resource-env-ref-name> 
    <resource-env-ref-type>org.springframework.data.mongodb.core.MongoTemplate</resource-env-ref-type> 
</resource-env-ref> 
3

重用胡安·安東尼的ObjectFactory接口(CustomMongoJNDIFactory)的定製實現,它也可以在context.xml file使用Spring的jee命名空間的JNDI的查找標籤和相應的Tomcat的配置配置,這樣的:

spring-mongodb-persistence-context.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:mongo="http://www.springframework.org/schema/data/mongo" 
     xmlns:jee="http://www.springframework.org/schema/jee" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
     http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd"> 

    <jee:jndi-lookup id="mongoTemplate" jndi-name="java:/comp/env/jndi/MongoDB" expected-type="org.springframework.data.mongodb.core.MongoTemplate" /> 

    <mongo:repositories base-package="com.package.repository.mongodb" /> 

</beans> 

context.xml

<Resource name="jndi/MongoDB" 
    auth="Container" 
    type="org.springframework.data.mongodb.core.MongoTemplate" 
    factory="com.package.mongo.CustomMongoJNDIFactory" 
    username="test" 
    password="test" 
    host="localhost" 
    port="27017" 
    db="test" />