【发布时间】:2013-05-30 14:20:56
【问题描述】:
我在我的 Spring Batch 代码中遇到了一个错误,它说: 在类路径资源中创建名称为“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());
}
}
谁能帮帮我?
【问题讨论】:
-
这意味着您正在尝试将代理对象注入某个名为“preparedStatementSetter”的属性中,但类型不匹配。没有看到设置器的代码,或者它是如何被注入的,我最好的猜测是你通过它的具体类而不是它的接口来引用'preparedStatementSetter'。如果可能,您应该始终使用该界面作为您的参考持有人。
-
感谢您的回复。我添加了缺失的代码,请问还有什么提示吗?
-
你的 AOP 东西是如何设置的?我认为如果您使用 CGLibs,它创建代理的方式与标准 JDK 方式不同。
-
问题是 i
m new to spring batch (my first project) and i dont know what are you talking about. BTW im 使用 maven,如果这就是你所说的!大声笑 -
简而言之,正在为您的 ReaderSqlParameterSetter 类生成一个“代理”。由于各种原因,代理对象用于包装真实类。我认为在您的情况下,这是因为您在 ReaderSqlParameterSetter 上将范围设置为“step”。根据 JavaDoc,使用 Step Scope 会打开 AOP Scoped Proxy。这更能说明 AOP 代理:static.springsource.org/spring/docs/current/…
标签: spring spring-batch