1

問題: コンテキスト XML に環境変数を埋め込むと、ローカルで実行すると展開されます。しかし、OpenShift にデプロイすると、そうではありません。それらは null に解決されます。

構成: web.xml:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/springapp.xml</param-value>
</context-param>

springapp.xml:

<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://#{systemProperties['OPENSHIFT_MYSQL_DB_HOST']}:#{systemProperties['OPENSHIFT_MYSQL_DB_PORT']}/prepare?characterEncoding=UTF-8"/>
        <property name="username"  value="AAA"/>
        <property name="password" value="BBB"/>
</bean>

pom.xml:

  • 春のバージョン 3.2.0.RELEASE

ローカル開発環境:

  • Intellij (構成で設定された環境変数)
  • Tomcat7

OpenShift 環境:

  • Tomcat 7 (JBoss EWS 2.0)
  • OpenShift によって設定される環境変数。「env」コマンドで値を確認しました。
    OPENSHIFT_MYSQL_DB_PORT=3306
    OPENSHIFT_MYSQL_DB_HOST=127.3.xxx.yyy

OpenShift のメッセージ (サーバーとポートが null であることに注意してください):

org.apache.commons.dbcp.SQLNestedException: 接続 URL 'jdbc:mysql://:/prepare?characterEncoding=UTF-8' のクラス 'com.mysql.jdbc.Driver' の JDBC ドライバーを作成できません

4

1 に答える 1

1

ローカル開発と OpenShift JBoss を構成するための私のソリューション。

私はついにenv変数を展開しようとすることをあきらめました。ストレートの tomcat では問題なく動作しましたが、JBoss では完全に機能しませんでした。そこで、ナムの方法に切り替えました。

Namが言ったように、OpenShiftはcontext.xmlに正しいjdbc接続を作成しました。そのため、ローカルマシンでも同じものが必要でした。これを /usr/local/Cellar/tomcat/7.0.39/libexec/conf/context.xml に配置して複製しました。

<Resource name="jdbc/MysqlDS"
              url="jdbc:mysql://localhost:3306/prepare?characterEncoding=UTF-8"
              driverClassName="com.mysql.jdbc.Driver"
              username="AAA"
              password="BBB"
              auth="Container"
              type="javax.sql.DataSource"
              maxActive="20"
              maxIdle="5"
              maxWait="10000"
              />

次に<bean id=datasource... 、springapp.xml から削除しました。

最後に、sessionFactory の dataSource プロパティを次のように変更しました。

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <bean class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiName" value="jdbc/MysqlDS"/>
            <property name="resourceRef" value="true"/>
        </bean>
    </property>
    <property name="packagesToScan" value="com.xxx.yyy.zzz"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLMyISAMDialect</prop>
            <prop key="hibernate.show_sql">false</prop>
        </props>
    </property>
</bean>

これで、tomcat の context.xml がローカル構成を処理します。Spring Bean 定義には適切な情報があります。

于 2013-09-04T15:11:07.500 に答える