Le contexte est en lecture seule
Helo maîtres, je dois créer une Datasource JNDI de façon dynamique, j'ai essayé de le faire avec un auditeur a appelé SetupApplicationListener. Voici le début de WEB-LIB/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee">
<display-name>pri-web</display-name>
<!-- Listeners -->
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
<listener>
<listener-class>myapp.SetupApplicationListener</listener-class>
</listener>
Le code de l'auditeur: l'
public class SetupApplicationListener implements ServletContextListener {
public static Log LOG = null;
public void contextInitialized(ServletContextEvent ctx){
try {
createOracleDataSource();
.....
}
}
private void createOracleDataSource() throws SQLException, NamingException {
OracleDataSource ds = new OracleDataSource();
ds.setDriverType(...);
ds.setServerName(...);
ds.setPortNumber(...);
ds.setDatabaseName(...);
ds.setUser(...);
ds.setPassword(...);
new InitialContext().bind("java:comp/env/jdbc/myDS", ds);
}
.....
}
Et il y a l'erreur:
[ERROR] 29/01/2013 09:44:50,517 (SetupApplicationListener.java:86) -> Error
javax.naming.NamingException: Context is read only
at org.apache.naming.NamingContext.checkWritable(NamingContext.java:903)
at org.apache.naming.NamingContext.bind(NamingContext.java:831)
at org.apache.naming.NamingContext.bind(NamingContext.java:171)
at org.apache.naming.NamingContext.bind(NamingContext.java:187)
at org.apache.naming.SelectorContext.bind(SelectorContext.java:186)
at javax.naming.InitialContext.bind(InitialContext.java:359)
at myapp.SetupApplicationListener.createOracleDataSource(SetupApplicationListener.java:102)
Puis-je définir les propriétés en lecture seule du Contexte pour "vrai"? Merci! 🙂
Tomcat 6.0
Oracle 11g
jdk1.5
MODIFIER: N'ont pas besoin d'être dynamique, j'ai de définir une datasource jndi en interne je ne peux pas modifier les fichiers du serveur, car c'est un serveur partagé. Il doit être jndi parce que d'autres modules de l'utiliser de cette façon, merci.
- résolu grâce à OscarRyz stackoverflow.com/questions/13734391/...
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin de créer une source de données dynamiquement est-il vraiment nécessaire pour une recherche JNDI? JNDI est conçu pour rendre la connexion externe à l'application, tandis que dans le scénario de ses étroitement couplée à la demande en raison d'un besoin légitime. Pourquoi ne pas simplement utiliser une connexion JDBC?
Je n'ai pas ce problème avant depuis que je suis habituellement défini de JNDI du serveur d'application(tomcat, weblogic et etc). Tout comme ce que Kevin a dit, c'est exactement ce que JNDI a été conçu pour; la séparation de la source de données config à partir de votre code source et de la récupération des ressources JNDI par le biais de recherche et d'injecter;
Revenir à votre question, je pense que tomcat a tous des règles strictes sur la modification de JNDI au moment de l'exécution. En d'autres mots, vous ne pouvez pas re-lier ou supprimer jndi de Contexte. Si vous passez par le tomcat spécifications que vous verrez probablement quelque chose à propos de la recherche jndi mais pas de re-lier.
De la section EE.5.3.4 de l'EE 6 plate-forme de spécification (JSR 316):
Note que "leur contexte de nommage" dans cette section se réfère à
java:comp
.Vous avez besoin pour créer un ServletContextListener et de là vous pouvez prendre la InitialContext écriture - ce n'est pas la façon dont il devrait être fait, mais si vous en avez vraiment besoin, c'est une façon de le faire.
Cela fonctionne aussi avec Java Mélodie!
J'ai résolu ce problème lorsque constaté que je n'étais fermeture environmentContext objet
Par exemple:
Et mon code est:
Après la suppression de fermer la fonction de environmentContext problème a été vendu pour moi;
J'ai aussi eu ce problème, mais étant nouveau Tomee, je ne savais pas qu'il y est une solution simple. Quand j'ai déployé mon application web dans le répertoire webapps, l'application fonctionne bien, mais quand j'ai déployé un service de dossier, j'ai eu le même abandon. Le problème était que le nom du dossier ne correspond pas à la guerre, le nom (sans le .de la guerre). Une fois que j'ai fixé, l'application a bien fonctionné. Assurez-vous que la guerre, le nom, le nom de dossier et nom de service sont identiques. Ce problème produit plusieurs erreurs, dont le Contexte est en lecture seule Erreur et de la fusion de Java EE JNDI entrées.
J'ai résolu ce problème en définissant
useNaming="false"
dans mon context.xml.À partir de la documentation: