Domanda

Sono una persona che ha usato per fare un po 'di codifica J2EE in passato e sto tornando in piega a lavorare su un nuovo progetto J2EE. Molte cose sono cambiate dal 2001, quindi ho bisogno di fare questa domanda molto di base.

sto usando la sintassi del genere nella mia classe di database:

@Resource(name = "jdbc/MyDatabase")  
private javax.sql.DataSource dataSource;  

Capisco che questo è una nuova funzionalità (annotazioni) ma non sono davvero sicuro di come funziona. Più tardi nella mia classe Faccio presente invito:

Connection c = dataSource.getConnection();  

E getta un'ogni NullPointerException. I passo in questo nel debugger e come risulta, dataSource è nullo.

Sembra magico e strano che io non inizializzare dataSource me stesso nel codice. Qualche idea di cosa sto facendo male?

Il mio web.xml contiene il seguente blocco di stabilire la risorsa:

<resource-env-ref>
    <resource-env-ref-name>jdbc/MyDatabase</resource-env-ref-name>
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>

E ho aggiunto questo al mio Contesto utilizzando un file context.xml in META-INF. L'entrata contesto appare come:

<Resource name="jdbc/MyDatabase" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="username" password="password" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://127.0.0.1:3306/mydb?autoReconnect=true"/>

sto usando Tomcat 6, MySQL 5, l'ultimo driver MySQL (non il più vecchio v3 ma il driver più recente v5).

Aggiornamento: Questo non sta lavorando per me perché sto utilizzando in una classe normale-vecchio. Ho creato un nuovo progetto e aggiunto un servlet ad esso. Il DataSource non è nullo nella servlet.

È stato utile?

Soluzione

È necessario almeno avere la seguente sia /conf/context.xml del appserver o il file /META-INF/context.xml del webapplication:

<Resource
    name="jdbc/MyDatabase" 
    type="javax.sql.DataSource"
    driverClassName="com.your.Driver"
    url="jdbc:your://url"
    username="foo"
    password="bar"
/>

Si veda anche http://tomcat.apache.org/ tomcat-6.0-doc / JNDI-risorse-HOWTO.html

E nel /WEB-INF/web.xml della webapp è necessario definire quanto segue:

<resource-env-ref>
    <resource-env-ref-name>jdbc/MyDatabase</resource-env-ref-name>
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>

Modifica : ora vedo che si è modificato il tuo post per aggiungere la codifica. Vedo anche che si è utilizzato resource-ref invece di resource-env-ref. La prima si riferisce a una risorsa esterna (leggi: senza WebContainer gestiti) e la seconda si riferisce ad una risorsa interna (ambientale) (leggi: WebContainer gestiti). Sostituire e vedere.

Altri suggerimenti

Il tuo web.xml definire la risorsa? Date un'occhiata a questo esempio . Potrebbe pubblicare il tuo web.xml oppure il codice che definisce il jdbc / MyDatabase?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top