【问题标题】:What does Failed to convert property value of type '$Proxy0 to required type means?无法将 '$Proxy0 类型的属性值转换为所需类型是什么意思?
【发布时间】: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 方式不同。
  • 问题是 im 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


【解决方案1】:

您没有使用正确的界面。您的 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 类型的错误!

【讨论】:

  • 我更正了代码,但它给了我另一个错误,即“设置属性值时出错,Bean 属性 'preparedStatementSetter' 不可写或设置方法无效”
  • 呵呵...你只是忘了在你的实现中写一个setter。一直在发生;-)
  • 还有scope=step吗?
  • 我确实有实施,但我没有发布。它对 readerSetter 更相似。是的,我仍然有 scope=step。
  • 我在主帖中添加了作者的代码,以向您澄清事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2021-07-08
  • 1970-01-01
  • 2017-02-23
  • 2017-05-12
  • 2018-08-21
  • 2017-04-21
相关资源
最近更新 更多