2016-08-08 2 views
2

je dois courir un Grails 3 app contre MySql/Mise en veille prolongée et MongoDB. (Had fonctionne sur Grails 2.5 sans accroc).En utilisant MongoDB et mise en veille prolongée avec grails3

J'ai essayé beaucoup de combinaisons différentes, cherché et essayé des réponses SO connexes, mais sans chance.

Utilisé le dernier document plugin Mongodb pour la configuration.

Utilisation Grails 3.1.10:

grailsVersion=3.1.10 

J'ai commencé avec les détails suivants build.gradle:

buildscript { 
    ext { 
    grailsVersion = project.grailsVersion 
    } 
    repositories { 
    mavenLocal() 
    maven { url "https://repo.grails.org/grails/core" } 
    } 
    dependencies { 
    classpath "org.grails:grails-gradle-plugin:$grailsVersion" 
    classpath "com.bertramlabs.plugins:asset-pipeline-gradle:2.8.2" 
    classpath "org.grails.plugins:hibernate4:5.0.10" 
    } 
} 
... 
dependencies { 
    compile "org.springframework.boot:spring-boot-starter-logging" 
    compile "org.springframework.boot:spring-boot-autoconfigure" 
    compile "org.grails:grails-core" 
    compile "org.springframework.boot:spring-boot-starter-actuator" 
    compile "org.springframework.boot:spring-boot-starter-tomcat" 
    compile "org.grails:grails-dependencies" 
    compile "org.grails:grails-web-boot" 
    compile "org.grails.plugins:cache" 
    compile "org.grails.plugins:scaffolding" 
    compile "org.grails.plugins:hibernate4" 
    compile "org.hibernate:hibernate-ehcache" 
    console "org.grails:grails-console" 
    profile "org.grails.profiles:web" 

    runtime "com.bertramlabs.plugins:asset-pipeline-grails:2.8.2" 

    testCompile "org.grails:grails-plugin-testing" 
    testCompile "org.grails.plugins:geb" 
    testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1" 
    testRuntime "net.sourceforge.htmlunit:htmlunit:2.18" 

    //databases 
    compile 'org.grails.plugins:mongodb:6.0.0.M2' 
    runtime 'mysql:mysql-connector-java:5.1.36' 
    ... 
} 

Le application.yml:

--- 
hibernate: 
    cache: 
    queries: false 
    use_second_level_cache: true 
    use_query_cache: false 
    region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory 

dataSource: 
    pooled: true 
    jmxExport: true 
    driverClassName: com.mysql.jdbc.Driver 

environments: 
    development: 
    dataSource: 
     dbCreate: update 
     url: jdbc:mysql://localhost:3306/dbname 
     driverClassName: com.mysql.jdbc.Driver 
     dialect: org.hibernate.dialect.MySQL5InnoDBDialect 
     username : "xxx" 
     password : "yyy" 
     properties: 
      maxActive : 50 
      maxIdle: 25 
      minIdle: 5 
      ... 
    grails: 
    mongodb: 
     host: "localhost" 
     port: 27017 
     username: "blah" 
     password: "blah" 
     databaseName: "foo" 

Maintenant, cela donne moi une erreur:

15:13:58.001 [QUIET] [system.out] ERROR  org.springframework.boot.SpringApplication - Application startup failed 
15:13:58.001 [QUIET] [system.out] java.lang.NoClassDefFoundError: org/grails/datastore/gorm/plugin/support/ConfigSupport 
15:13:58.001 [QUIET] [system.out] at grails.plugins.mongodb.MongodbGrailsPlugin.doWithSpring(MongodbGrailsPlugin.groovy:42) 

Le MongoDB Grails plugin ne trouve pas ConfigSupport

ConfigSupport.prepareConfig(config, (ConfigurableApplicationContext) applicationContext) 

J'ai ensuite essayé d'ajouter les plug-ins suivants dans tous les ordres possibles:

//compile 'org.grails:grails-datastore-gorm-hibernate4:6.0.0.M2' 
//compile 'org.grails:grails-datastore-core:4.0.0.M2' 
//compile 'org.grails:grails-datastore-gorm-plugin-support:6.0.0.M2' 
//compile 'org.springframework.data:spring-data-mongodb:1.9.2.RELEASE' 
//compile 'org.mongodb:mongodb-driver:3.3.0' 
//compile 'org.mongodb:mongo-java-driver:3.3.0' 

Pas de chance.

J'ai aussi déplacé le mongodb: section vers le bas pour les Grails: section dans le fichier YML. Même erreur Donc, la question est de savoir comment faire fonctionner MongoDB avec MySql avec grails3.

Répondre

1

Ok, stupide moi. Je résolu le casse-tête en utilisant ces simples paramètres de dépendance:

compile "org.springframework.boot:spring-boot-starter-logging" 
compile "org.springframework.boot:spring-boot-autoconfigure" 
compile "org.grails:grails-core" 
compile "org.springframework.boot:spring-boot-starter-actuator" 
compile "org.springframework.boot:spring-boot-starter-tomcat" 
compile "org.grails:grails-dependencies" 
compile "org.grails:grails-web-boot" 
compile "org.grails.plugins:cache" 
compile "org.grails.plugins:scaffolding" 
compile "org.grails.plugins:hibernate4" 
compile "org.hibernate:hibernate-ehcache" 
console "org.grails:grails-console" 
profile "org.grails.profiles:web" 
runtime "com.bertramlabs.plugins:asset-pipeline-grails:2.8.2" 
testCompile "org.grails:grails-plugin-testing" 
testCompile "org.grails.plugins:geb" 
testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1" 
testRuntime "net.sourceforge.htmlunit:htmlunit:2.18" 

//databases 
compile 'org.grails.plugins:mongodb' 
runtime 'mysql:mysql-connector-java:5.1.36' 

runtime 'com.googlecode.json-simple:json-simple:1.1' 

Il semble que la ligne suivante a fait la différence:

compile 'org.grails.plugins:mongodb' 

Omettre le numéro de version. Cela devrait être expliqué dans les docs un peu mieux. Habituellement c'est une bonne chose de définir les versions, ou est-ce trop démodé ces jours-ci? :-)

heureux de l'avoir à travailler

0

Je ne sais pas je peux aider beaucoup d'autres que montrer ma config qui fonctionne confirmée. J'ai récemment converti une application 2.4.4 en 3.1.8, mais j'utilise Oracle comme RDBMS plutôt que mysql.

En build.gradle je viens:

dependencies { 
classpath "org.grails.plugins:hibernate4:5.0.6" 
... 
} 

dependencies { 
compile "org.grails.plugins:mongodb:5.0.0.RC1" 
... 
} 

et en application.YML:

mongodb: 
    databaseName: 'myApp' 
    engine: mapping 

Le moteur: bit de cartographie était crucial pour moi, il revient au moteur de persistance précédente comme décrit ici http://gorm.grails.org/latest/mongodb/manual/index.html

La fermeture dans mon MongodbGrailsPlugin.groovy ressemble doWithSpring():

Closure doWithSpring() { 
def initializer = new MongoDbDataStoreSpringInitializer(config,  grailsApplication.getArtefacts(DomainClassArtefactHandler.TYPE).collect() {  GrailsClass cls -> cls.clazz }) 
initializer.registerApplicationIfNotPresent = false 
initializer.setSecondaryDatastore(manager.hasGrailsPlugin("hibernate") ) 
return  initializer.getBeanDefinitions((BeanDefinitionRegistry)applicationContext) 
} 

Aucune référence à ConfigSupport qui peut avoir été ajoutée (ou non) dans votre version ultérieure ou une dépendance est manquante.

1

Ok j'ai trouvé bonne réponse précédente pour faire référence plugin MongoDB, à savoir
compile 'org.grails.plugins:mongodb'
mais je veux résumer avec une brève liste de contrôle, me avoir une solution mixte fonctionne correctement (à la fois mise en veille prolongée + MySQL et MongoDB), après de nombreux essais et les erreurs.
Ainsi, afin d'avoir un mélange mysql/mongo configuration grails3, vous devez

  1. 'insert Compile org.grails.plugins: MongoDB' (sans la version) dans build.gradle (rappelez-vous qu'il n'y a BuildConfig.groovy dans Grails 3, comme documented here/grails2->3)
  2. garder la dépendance ordinaire mise en veille prolongée/mysql, par exemple: compile 'org.grails.plugins:hibernate4' compile 'org.hibernate:hibernate-ehcache' runtime 'mysql:mysql-connector-java:5.1.38'
  3. configuré correctement les connexions à application.yml, mais je préfère le style ancien application.groovy, en grails- app/conf (comme dans les anciens GRAILS), comme ci-dessous (rappelez-vous que dans GRAILS3 différemment de 2, vous devez utiliser mongodb et pas mo re mongo mot-clé)
  4. utilisation des entités Grails ordinaires pour la cartographie mysql
  5. et utiliser static mapWith="mongo" à l'intérieur des entités mongo (comme indiqué dans GRAILS-mongo doc)
  6. pas utiliser MySQL habituel id long pour mongo, mais ObjectId id, et pour elle import org.bson.types.ObjectId


Application.groovy mis en place

grails { 
    mongodb { 
     host = "localhost" 
     port = 27017 
     username = mongouser 
     password= mongopasswd 
     databaseName = mongoDBname 
     } 
} 
environments { 
    development { 
    dataSource { 
     driverClassName = "com.mysql.jdbc.Driver" 
     username = ... 
     password = ... 
     dbCreate = "create" 
     url = "jdbc:mysql://127.0.0.1:3306/dbnameMysql" 
    } 
    } 
} 

C'est tout. Profitez de MongoDB.