簡単に言えば、問題は、最初に JdbcTemplate を呼び出してデータベースにクエリを実行したときに、結果セットが空になることです。
2 回目に DAO メソッドにアクセスすると、期待どおりの結果が得られます。クラスの設定方法の詳細は次のとおりです。
親データ アクセス オブジェクトを拡張するデータ アクセス オブジェクトがあります。親の dao クラスは、データソースを JdbcTemplate のコンストラクターに挿入するだけです。
public class BaseDao
{
private JdbcTemplate usrJdbcTemplate;
public void setUsrDataSource(DataSource usrDataSource)
{
this.usrJdbcTemplate = new JdbcTemplate(usrDataSource);
}
public JdbcTemplate getUsrJdbcTemplate()
{
return this.usrJdbcTemplate;
}
}
これを拡張するクラスは、この JdbcTemplate を使用してテーブルをクエリします。
public class OimUserDao extends BaseDao
{
public Date getPasswordExpiryDate(String userName)
{
String sql = "select USR_PWD_EXPIRE_DATE from USR where UPPER (USR_LOGIN) = ?";
List<java.sql.Date> dtLst = getUsrJdbcTemplate().query(sql, new Object[] {userName.toUpperCase()}, new RowMapper<java.sql.Date>()
{
@Override
public java.sql.Date mapRow(final ResultSet rs, int rowNum) throws SQLException
{
return rs.getDate(1);
}
});
if (dtLst.size()>0)
{
return dtLst.get(0);
}
else
{
return null;
}
}
}
DAO は、@Autowired アノテーションを使用してサービスで自動配線されます。xml での DAO 宣言:
<bean id="baseDao" class="us.worldpay.portalgateway.dao.BaseDao">
<property name="usrDataSource" ref="usrDataSource" />
</bean>
<bean id="oimUserDao" class="us.worldpay.portalgateway.dao.OimUserDao" parent="baseDao" />
Web.xml には、これらの DAO の Bean 定義を含む xml の宣言があります (pg-data は、関心のあるものです)。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/pg-servlet.xml,
/WEB-INF/pg-data.xml
</param-value>
</context-param>
さらに悪いことに、これは、QA 環境と同じデータベース (Oracle) を指すローカル ボックス (Weblogic) では決して発生しません。ローカル ボックスでこれを実行すると、初回の結果セットにデータが入力され、データが含まれます。これを QA env (Weblogic) で実行すると、最初は結果セットが空になります。私はこれに何時間も費やしましたが、どこにも行きませんでした。
この投稿をお読みいただきありがとうございます。私が得ることができるすべての助けに感謝しています。