2012-09-18 21 views
7

mi permetta di descrivere l'ambiente prima:apache tomcat 7.0.30 datasourcerealm javax.naming.NameNotFoundException: Nome [jdbc/proto] non è associato in questo contesto. Impossibile trovare [JDBC]

ambiente: - Mac OS X (java costruire 1.6.0_35-b10-428-11M3811) - Tomcat di Apache 7.0.30 - mysql 5.5.27 - tomcat/lib -> mysql-connector-java-5.1.22-bin.jar

Ho implementato con successo un JDBCRealm e si desidera passare a un DataSourceRealm perché è raccomandato per ambienti di produzione. io uso l'autenticazione basata su form.

ho fatto tutto descritto qui: http://tomcat.apache.org/tomcat-7.0-doc/realm-howto.html#DataSourceRealm e qui: http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html#MySQL_DBCP_Example

server.xml

<Realm className="org.apache.catalina.realm.LockOutRealm"> 
    <Realm className="org.apache.catalina.realm.DataSourceRealm" 
      dataSourceName="jdbc/proto" digest="SHA-256" roleNameCol="role" 
      userCredCol="password" userNameCol="name" userRoleTable="roles" 
      userTable="users"/> 
</Realm> 

context.xml

<Resource auth="Container" 
      driverClassName="com.mysql.jdbc.Driver" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      name="jdbc/proto" password="proto" type="javax.sql.DataSource" 
      url="jdbc:mysql://localhost:3306/proto" username="proto"/> 

WEB-INF/web.xml

<resource-ref> 
    <description>DB Connection</description> 
    <res-ref-name>jdbc/proto</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

quando presento il nome utente e la password ottengo la seguente eccezione:

Sep 18, 2012 9:38:32 PM org.apache.catalina.realm.DataSourceRealm open 
SEVERE: Exception performing authentication 
javax.naming.NameNotFoundException: Name [jdbc/proto] is not bound in this Context. Unable to find [jdbc]. 
at org.apache.naming.NamingContext.lookup(NamingContext.java:820) 
at org.apache.naming.NamingContext.lookup(NamingContext.java:168) 
at org.apache.catalina.realm.DataSourceRealm.open(DataSourceRealm.java:394) 
at org.apache.catalina.realm.DataSourceRealm.authenticate(DataSourceRealm.java:285) 
at org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:146) 
at org.apache.catalina.realm.LockOutRealm.authenticate(LockOutRealm.java:180) 
at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:295) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:450) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:680) 

non ho cercato di impostare l'ambiente su un diverso sistema operativo per verificare se si tratta di un problema specifico per Mac.

qualche suggerimento cosa ho perso? Apprezzo il vostro aiuto! grazie.

+0

funziona quando sposto la voce da ** context.xml ** a ** server.xml - ** -> ma lo voglio davvero? – user1681351

risposta

0

Nel mio caso il problema era che avevo una dipendenza in conflitto nel mio pom.xml. Nel mio caso era la dipendenza java-naming. Assicurati di non avere dipendenze/nomi di nomi che siano in conflitto con le librerie di denominazione di Tomcat.

Dopo averlo rimosso, il problema è scomparso (lo stesso ambiente di cui si è a conoscenza).

3

In questo caso credo che sia perché il tuo regno (in questo caso si è dichiarato a livello di server) sta cercando di utilizzare una risorsa di denominazione, jdbc/proto (che in questo caso è dichiarato a livello di applicazione web)

Ecco quello che ho capito è il contesto gerarchia server Java

  1. Server
  2. Host
  3. WebApplication context (può essere in server.xml, o in META-INF Conte xt.xml)
4

Per evitare dichiarando la ressource in GlobalNamingResources, ha messo localDataSource = "true" nel Regno

1

In realtà questo [jdbc/proto] è menzionato in ProjectName.xml come proprietà come

<ResourceLink global="jdbc/proto" name="jdbc/proto"/> 

Così assicurati che il file ProjectName.xml esista allo tomcatInstances/ServerName/conf/Catalina/localhost/ProjectName.xml e che abbia questo link di risorsa e la tua eccezione non ci sia più.

Ho anche affrontato lo stesso problema e ha ottenuto quel file contesto locale di applicazione è stato ottenuto cancellato per qualche ragione dalla posizione

tomcatInstances/ServerName/conf/Catalina/localhost/ProjectName.xml 

Restaurato i file dal retro e fatto ... il suo bel lavoro oggi, spero che questo aiuterà qualcuno.

+0

Cosa deve essere presente in "ProjectName.xml'? – krismath