2013-04-17 6 views
7

Wenn Spring Batch-Admin, es einige Standardwerte für die Datenquelle zu liefern versucht, transaction usw.Mit jndi Datenquelle mit Feder Batch-Server-Betreiber

Wenn Sie diese Standardwerte außer Kraft setzen möchten, können Sie Ihre eigene XML-Bean-Definitionen unter META erstellen -INF/spring/batch/servlet/override/ Ordner und garantiert während des Bootstrappings, dass die Standardeigenschaften überschrieben werden.

Im Frühjahr-Batch-admin, eine Datenquelle Standard in Datenquelle-context.xml mit dieser Definition definiert ist

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${batch.jdbc.driver}" /> 
    <property name="url" value="${batch.jdbc.url}" /> 
    <property name="username" value="${batch.jdbc.user}" /> 
    <property name="password" value="${batch.jdbc.password}" /> 
    <property name="testWhileIdle" value="${batch.jdbc.testWhileIdle}"/> 
    <property name="validationQuery" value="${batch.jdbc.validationQuery}"/> 
</bean> 

Jetzt möchte ich diese Datasource mit einer JNDI-Datenquelle außer Kraft zu setzen, so entfernte ich die die folgende jndi Definition Eigenschaft Linien wie batch.jdbc.driver, batch.jdbc.url und haben

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/dbconn" /> 
</bean> 

wie Sie können sich leicht vorstellen, das System zuerst die Datenquelle Bohne in data-source-context.xml definiert zu initialisieren versucht und da es keine Werte finden p Property-Werte batch.jdbc. * Es schlägt mit einer Ausnahme fehl.

konnte nicht Platzhalter 'batch.jdbc.driver' in String-Wert [$ {batch.jdbc.driver}] lösen

Da ich JNDI verwenden werden und wollen nicht mit diesen beschäftigen Eigenschaftswerte, kann ich nicht fortfahren.

Haben Sie eine Idee, wie Sie DataSource in dieser Situation überschreiben können?

+0

Hi - haben Sie eine Lösung gefunden? (Ich möchte Profile nicht nur für dieses Problem verwenden.) – dsatish

+0

@sdny Nein. Auch versuchen, eine Lösung ohne Profile zu verwenden. –

+0

Ich habe das gleiche Problem überfahren. Selbst wenn ich eine funktionierende "Standard" -Verbindung mit den erforderlichen Eigenschaften eingerichtet habe, konnte ich die DataSource override nicht verwenden. – Eric

Antwort

6

Innerhalb Spring Batch Admin gibt es 2 Spring ApplicationContexts, die geladen werden:

  • Servlet-config.xml
  • Webapp-config.xml

Servlet-config.xml hat diese Importe:

<import resource="classpath*:/META-INF/spring/batch/servlet/resources/*.xml" /> 
<import resource="classpath*:/META-INF/spring/batch/servlet/manager/*.xml" /> 
<import resource="classpath*:/META-INF/spring/batch/servlet/override/*.xml" /> 

Webapp-config.xml hat diese Importe:

<import resource="classpath*:/META-INF/spring/batch/bootstrap/**/*.xml" /> 
<import resource="classpath*:/META-INF/spring/batch/override/**/*.xml" /> 

servlet-config.xml konfiguriert das Servlet, webapp-config.xml konfiguriert (das Backend-Teil) der Anwendung. Das Problem ist, dass das DataSource-Bean Teil der zweiten Konfiguration ist und in der zweiten nicht definiert ist. Wenn Sie also die dataSource-Bean einer Überschreibung für die Servlet-Konfiguration hinzufügen (/ META-INF/spring/batch/servlet/override/* .xml), fügen Sie währenddessen eine neue Bean zum ersten Kontext hinzu. anstatt die DataSource-Bean des zweiten Kontextes zu überschreiben.

So müssen Sie Ihre benutzerdefinierten Daten-source-context.xml unter META-INF/Frühjahr/Batch/Betätigung/anstelle von META-INF/Frühjahr/Batch/Servlet/Betätigung/

setzen Dann funktioniert es und Sie erhalten nicht einmal den Could not resolve placeholder 'batch.jdbc.driver' in string value [${batch.jdbc.driver}] Fehler.

+0

setzen Sie können den Inhalt der Kontextdatei, die Sie hinzugefügt zu META-INF/spring/batch/override? – emeraldjava

+0

Ich kopierte env-context.xml /batch/override/manager/env-context.xml und geändert Classpath: Batch - $ {ENVIRONMENT: hsql} .properties- Classpath: batch-mysql.properties aber es ist funktioniert nicht – vishal

+0

Können Sie bestätigen, ob Sie dies zum Haupt- oder Webapps-Ordner Ihres Maven-Projekts hinzugefügt haben? Ich musste den Kontext gemäß diesem Thread in den Hauptordner verschieben. http://forum.spring.io/forum/spring-projects/batch/84070-spring-batch-admin-db-connection-by-datasource – emeraldjava

3

seit Frühjahr 3.1 gibt es die Funktion ‚Profile‘ mit dem Sie Ihre Datenquelle ‚Quelle‘ festlegen kann auf der Grundlage der Umgebung, die Sie sind in. (Ein eingebetteten einer für die lokale Prüfung, ein JNDI ein für die Bereitstellung.)

würde dies ungefähr wie folgt aussehen;

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <!-- "production" datasource --> 
    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/dbconn"/> 

    <!-- profile for "local" testing --> 
    <beans profile="local"> 
      <!-- datasource that only gets created in that active profile --> 
     <jdbc:embedded-database id="dataSource" type="H2"/> 
    </beans> 


</beans> 

in diesem Beispiel, wenn das ‚aktive Profil‘ auf „lokal“ gesetzt ist, überschreibt er die jndi-Lookup-Datenquelle.