Je développe actuellement un plugin Grails en utilisant Grails 2.3.11 et familier en utilisant plusieurs sources de données. Mais maintenant je veux que mes objets de domaine fournis par ce plugin puissent utiliser une source de données différente (pour des raisons de performances, toutes les données peuvent être stockées dans une base de données différente). Le problème est que cette deuxième source de données est facultative, ce qui signifie que l'utilisateur peut définir une deuxième source de données dans tomcat (accessible via JNDI), mais n'a pas à le faire. C'est un point important: l'utilisateur peut définir une seconde source de données dans le conteneur de servlet et l'application Grails doit vérifier s'il existe une seconde source de données disponible!Définir la source de données optionnelle (multiple) dans Grails
Soyez plus précis: j'ai une classe de domaine:
class MyDomain {
static mapping = {
datasource('optionalDS')
}
}
Mon DataSource.groovy:
dataSource {
jndiName = "..."
}
dataSource_optionalDS {
jndiName = "..."
}
Le problème est que cela échouera si l'utilisateur n'a pas configuré le nom JNDI pour cette source de données facultative (parce qu'il est facultatif, il n'a pas à le faire).
J'ai essayé de créer une source de données délégante à la place:
class OptionalDataSource extends DelegatingDataSource {
...
// the main purpose is to check, if the optional DS
// can be created using JNDI. If this fails, the default
// DS is used
setTagetDataSource(dataSource)
...
}
Et dans mon descripteur de plugin:
def doWithSpring = {
dataSource_optionalDS(OptionalDataSource) {
// set default DS in case optional can not be created
dataSource = ref('dataSource')
}
}
Le problème avec cette solution est que la source de données optionalDS ne sont pas disponibles. Si je tente de lire les données, à savoir MyDomain.findAll() je reçois l'erreur suivante:
Methond on class MyDomain was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.
Je ne comprends pas pourquoi, parce que je peux définir la source de données par défaut de cette façon. Donc, ma question est: Comment puis-je définir une dataSource optionnelle dans Grails?
C'est une bonne idée. J'ai légèrement modifié votre code, car je dois déclarer cette dataSource facultative dans mes classes de domaine. Et, si cette recherche jndi échoue, j'utiliserai le nom jndi de ma source de données par défaut pour en créer un optionnel. – Phillip