2010-11-02 29 views
5

Baharda mongodb örneğinin jndi'den veri kaynağı ile başka bir db gibi ayarlanmasının mümkün olup olmadığını biliyor musunuz? Eğer JDBC erişim ile düzenli RDBMS gibi demek iseMongoDb via jndi

Thx

cevap

2

Bunu yapmak için MongoDB için bir JDBC sürücüsüne gerek duyarsınız. Sadece bir tane buldum ve MongoDB sayfasından "deneysel" olarak geçiyor: GitHub JDBC Driver for MongoDB.

bu sınırlamayı aşmak için bazı Fasulye çekirdeklerini kurabilir ve uygulamanıza DAO için bir MongoDB uygulaması oluşturabilirsiniz (bu şekilde, DAO arabirimini ve istemci bileşenlerini değiştirmeniz gerekmez).

Bu makaleler yardımcı olabilir:

11

Evet, bu mümkün birisi kendi Jndi fabrika oluşturabilir birinin kod güvenerek neden? sadece javax.naming.spi.ObjectFactory uygulayan bir sınıf oluşturmak ve JNDI bağlamından mongo çeken bir fasulye, bunu bahar veri-MongoTemplate nesnesi için yapılandırdım.

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); 
    } 
} 

}

Yay fasulyesi:

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

MongoDB için bir JDBC sürücüsü impl sağlamak için başka bir çaba var. İşte:

https://sourceforge.net/projects/mongojdbcdriver

herhangi bir tedbir tam değil, ama umarım yakında Java geliştiricileri tanıdık bir JDBC uygulamasını sağlayacaktır. ObjectFactory arayüzüne (CustomMongoJNDIFactory) Juan Melo özel bir uygulama yeniden kullanma

3

, o da böyle, context.xml file yılında Tomcat yapılandırma Spring'in jee ad alanının jndi-arama etiketini kullanarak ve karşılık gelen yapılandırılabilir:

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" />