2013-06-04 29 views
1

我在我的Spring批處理代碼中遇到一個錯誤: 在類路徑資源中定義名爲'itemReader'的bean時出錯,無法將類型爲'$ Proxy0'的屬性值轉換爲屬性'preparedStatementSetter'所需的類型。

這是我的ItemReader代碼:

<beans:bean id="itemReader" 
class="org.springframework.batch.item.database.JdbcCursorItemReader"> 
    <beans:property name="dataSource" ref="dataSource"/> 
    <beans:property name="sql" value="select * from Trans_Tst WHERE id =?"/> 
    <beans:property name="rowMapper" ref="romMapper"/> 
    <beans:property name="preparedStatementSetter" ref="ReaderSqlParameterSetter"/> 
</beans:bean> 



<beans:bean id="ReaderSqlParameterSetter" 
class="sa.com.anb.itg.dev.settlement.batch.ReaderSqlParameterSetter" scope="step"> 
<beans:property name="id" value="#{jobParameters[id]}"/> 
</beans:bean> 

,這是我ReaderSqlParameterSetter類:

package sa.com.anb.itg.dev.settlement.batch; 
import java.sql.PreparedStatement; 
import org.springframework.batch.item.database.ItemPreparedStatementSetter; 
import java.sql.SQLException; 

public class ReaderSqlParameterSetter implements 
ItemPreparedStatementSetter<transactionas>{ 

    public void setValues(transactionas transactionas,PreparedStatement ps) 
      throws SQLException { 
     ps.setInt(1, transactionas.GetID()); 

    } 

} 

<beans:bean id="jdbcWriter" 
    class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
    <beans:property name="dataSource" ref="dataSource"/> 
    <beans:property name="sql" value="update Trans_Tst set()amount) values (?) 
      where id= ?"/> 
    <beans:property name="preparedStatementSetter" 
      ref="WriterSqlParameterSetter"/> 
</beans:bean> 

<beans:bean id="WriterSqlParameterSetter" 
    class="sa.com.anb.itg.dev.settlement.batch.WriterSqlParameterSetter" scope="step"> 
    <beans:property name="amount" value="#{jobParameters[amount]}"/> 
    <beans:property name="id" value="#{jobParameters[id]}"/> 
</beans:bean> 



    public class WriterSqlParameterSetter implements PreparedStatementSetter { 

    transactionas transactionas = new transactionas(); 

    public void setValues(PreparedStatement ps) throws SQLException { 
     ps.setDouble(1, transactionas.GetAmount()); 
     ps.setInt(2, transactionas.GetID()); 

    } 

} 

有人能幫助我嗎?

+0

這意味着你正在嘗試將一個代理對象注入到一個名爲'preparedStatementSetter'的屬性中,但這些類型不匹配。沒有看到setter的代碼,或者它是如何被注入的,我最好的猜測是你正在通過它的具體類來引用'preparedStatementSetter',而不是它的接口。可能的話,您應該始終使用界面作爲您的參考持有者。 – CodeChimp

+0

感謝您的回覆。我添加了缺少的代碼,請提供更遠的提示? – user1744446

+0

你的AOP東西是如何設置的?我認爲如果你使用CGLib,它會創建與標準JDK方式不同的代理。 – CodeChimp

回答

2

您不使用正確的界面。你應該ReaderSqlParameterSetter實現PreparedStatementSetter沒有ItemPreparedStatementSetter

如果你看一下JdbcCursorItemReader的IMPL:

public class JdbcCursorItemReader<T> extends AbstractCursorItemReader<T> { 

PreparedStatement preparedStatement; 

PreparedStatementSetter preparedStatementSetter; 

String sql; 

RowMapper rowMapper; 

的屬性是一個PreparedStatementSetter。

如果你看一下界面,您嘗試使用:

public interface ItemPreparedStatementSetter<T> { 
/** 
* Set parameter values on the given PreparedStatement as determined from 
* the provided item. 
* @param ps the PreparedStatement to invoke setter methods on 
* @throws SQLException if a SQLException is encountered (i.e. there is no 
* need to catch SQLException) 
*/ 
void setValues(T item, PreparedStatement ps) throws SQLException; 

} 

此接口不擴展PreparedStatementSetter ...

所以這是行不通的。如果你還沒有把scope = step,你可能會有一個ClassCastException類錯誤!

+0

I更正了代碼,但它給了我另一個錯誤,即「錯誤設置屬性值,Bean屬性'preparedStatementSetter'不可寫或具有無效的setter方法」 – user1744446

+0

呵呵......你只是忘了在你的實現中寫一個setter。一直髮生;-) – Cygnusx1

+0

你仍然有範圍=步驟? – Cygnusx1

相關問題