MongoDb через jndi - PullRequest
       16

MongoDb через jndi

5 голосов
/ 02 ноября 2010

Знаете ли вы, можно ли весной установить экземпляр mongodb, как любой другой db через источник данных из jndi?

Thx

Ответы [ 5 ]

11 голосов
/ 28 января 2012

Да, возможно, зачем полагаться на чужой код, когда вы можете создать свою собственную фабрику JNDI? просто создайте класс, который реализует javax.naming.spi.ObjectFactory и bean-компонент, который извлекает монго из контекста JNDI, я настроил это для Spring-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);
    }
}

}

фасоль:

@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 голосов
/ 31 мая 2013

Повторно используя пользовательскую реализацию интерфейса ObjectFactory Хуана Мело (CustomMongoJNDIFactory), его также можно настроить с помощью тега jndi-lookup пространства имен Spring * jee и соответствующей конфигурации Tomcat в context.xml file, например так:

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" />
2 голосов
/ 02 ноября 2010

Для этого вам понадобится драйвер JDBC для MongoDB. Я нашел только один, и он упоминается как «экспериментальный» на странице MongoDB: Драйвер GitHub JDBC для MongoDB .

Чтобы обойти это ограничение, вы можете настроить некоторые бины Spring и создать реализацию MongoDB для вашего DAO приложения (таким образом, вам не нужно менять интерфейс DAO и его клиентские компоненты).

Эта статья может помочь:

0 голосов
/ 19 ноября 2012

Существует другая попытка предоставить драйвер JDBC для MongoDB. Здесь:

https://sourceforge.net/projects/mongojdbcdriver

Не завершено никакими мерами, но, надеюсь, предоставит реализацию JDBC, которая скоро станет известна разработчикам Java.

0 голосов
/ 02 ноября 2010

Если вы имеете в виду обычную СУБД с доступом к JDBC, то ответ - нет.

...