当我在Spring应用程序中使用JdbcTemplate BeanPropertyRowMapper类时,为什么会获得此InstantiationException?

时间:2016-07-05 14:58:05

标签: java spring spring-data jdbctemplate

我正在开发使用Spring开发的批处理,我尝试使用Sping JdbcTemplate BeanPropertyRowMapper Spring类来获取查询中的对象列表时出现问题具有数据库表字段的类的属性。

因此,在我的数据库(Microsoft SQL Server)上,我有一个名为 TassoRendimentoInterno 的表,其中包含以下具有以下数据类型的列:

ID  bigint
Conferimento    nvarchar
PolizzaID   bigint
ControvaloreQuote   decimal
percRendimentoInizioSottoscrizione  money
percRendimentoInizioAnno    money
percRendimentoInizioTrimestre   money
AnnoRiferimento int
TipoRendimento  nchar
TipoTrasmissione    nchar
FlagQuoteOK bit
DataInizioposizione datetime
DataInizioAnno  datetime
DataInizioTrimestre datetime
DataFinePosizione   datetime
QuotePuc    decimal
DataRiferimentoNavPUC   datetime
TIMESTAMP   datetime
controvalorePUC money
dataRiferimentoNavTIR   datetime
DataRiferimentoFlusso   datetime

然后我用这个名为 TassoRendimentoInterno 的类映射了这个表:

public class TassoRendimentoInterno {

    private String conferimento;
    private long polizzaID;
    private BigDecimal controvaloreQuote;
    private BigDecimal percRendimentoInizioSottoscrizione;
    private BigDecimal percRendimentoInizioAnno;
    private BigDecimal percRendimentoInizioTrimestre;
    private int annoRiferimento;
    private String tipoRendimento;
    private String tipoTrasmissione;
    private boolean flagQuoteOK;
    private Timestamp dataInizioposizione;
    private Timestamp dataInizioAnno;
    private Timestamp dataInizioTrimestre;
    private Timestamp dataFinePosizione;
    private BigDecimal quotePuc;
    private Timestamp dataRiferimentoNavPUC;
    private Timestamp timestamp;
    private BigDecimal controvalorePUC;
    private Timestamp dataRiferimentoNavTIR;
    private Timestamp dataRiferimentoFlusso;


    public TassoRendimentoInterno(String conferimento, long polizzaID,
            BigDecimal controvaloreQuote,
            BigDecimal percRendimentoInizioSottoscrizione,
            BigDecimal percRendimentoInizioAnno,
            BigDecimal percRendimentoInizioTrimestre, int annoRiferimento,
            String tipoRendimento, String tipoTrasmissione,
            boolean flagQuoteOK, Timestamp dataInizioposizione,
            Timestamp dataInizioAnno, Timestamp dataInizioTrimestre,
            Timestamp dataFinePosizione, BigDecimal quotePuc,
            Timestamp dataRiferimentoNavPUC, Timestamp timestamp,
            BigDecimal controvalorePUC, Timestamp dataRiferimentoNavTIR,
            Timestamp dataRiferimentoFlusso) {
        super();
        this.conferimento = conferimento;
        this.polizzaID = polizzaID;
        this.controvaloreQuote = controvaloreQuote;
        this.percRendimentoInizioSottoscrizione = percRendimentoInizioSottoscrizione;
        this.percRendimentoInizioAnno = percRendimentoInizioAnno;
        this.percRendimentoInizioTrimestre = percRendimentoInizioTrimestre;
        this.annoRiferimento = annoRiferimento;
        this.tipoRendimento = tipoRendimento;
        this.tipoTrasmissione = tipoTrasmissione;
        this.flagQuoteOK = flagQuoteOK;
        this.dataInizioposizione = dataInizioposizione;
        this.dataInizioAnno = dataInizioAnno;
        this.dataInizioTrimestre = dataInizioTrimestre;
        this.dataFinePosizione = dataFinePosizione;
        this.quotePuc = quotePuc;
        this.dataRiferimentoNavPUC = dataRiferimentoNavPUC;
        this.timestamp = timestamp;
        this.controvalorePUC = controvalorePUC;
        this.dataRiferimentoNavTIR = dataRiferimentoNavTIR;
        this.dataRiferimentoFlusso = dataRiferimentoFlusso;
    }
    public String getConferimento() {
        return conferimento;
    }
    public void setConferimento(String conferimento) {
        this.conferimento = conferimento;
    }
    public long getPolizzaID() {
        return polizzaID;
    }
    public void setPolizzaID(long polizzaID) {
        this.polizzaID = polizzaID;
    }
    public BigDecimal getControvaloreQuote() {
        return controvaloreQuote;
    }
    public void setControvaloreQuote(BigDecimal controvaloreQuote) {
        this.controvaloreQuote = controvaloreQuote;
    }
    public BigDecimal getPercRendimentoInizioSottoscrizione() {
        return percRendimentoInizioSottoscrizione;
    }
    public void setPercRendimentoInizioSottoscrizione(
            BigDecimal percRendimentoInizioSottoscrizione) {
        this.percRendimentoInizioSottoscrizione = percRendimentoInizioSottoscrizione;
    }
    public BigDecimal getPercRendimentoInizioAnno() {
        return percRendimentoInizioAnno;
    }
    public void setPercRendimentoInizioAnno(BigDecimal percRendimentoInizioAnno) {
        this.percRendimentoInizioAnno = percRendimentoInizioAnno;
    }
    public BigDecimal getPercRendimentoInizioTrimestre() {
        return percRendimentoInizioTrimestre;
    }
    public void setPercRendimentoInizioTrimestre(
            BigDecimal percRendimentoInizioTrimestre) {
        this.percRendimentoInizioTrimestre = percRendimentoInizioTrimestre;
    }
    public int getAnnoRiferimento() {
        return annoRiferimento;
    }
    public void setAnnoRiferimento(int annoRiferimento) {
        this.annoRiferimento = annoRiferimento;
    }
    public String getTipoRendimento() {
        return tipoRendimento;
    }
    public void setTipoRendimento(String tipoRendimento) {
        this.tipoRendimento = tipoRendimento;
    }
    public String getTipoTrasmissione() {
        return tipoTrasmissione;
    }
    public void setTipoTrasmissione(String tipoTrasmissione) {
        this.tipoTrasmissione = tipoTrasmissione;
    }
    public boolean isFlagQuoteOK() {
        return flagQuoteOK;
    }
    public void setFlagQuoteOK(boolean flagQuoteOK) {
        this.flagQuoteOK = flagQuoteOK;
    }
    public Timestamp getDataInizioposizione() {
        return dataInizioposizione;
    }
    public void setDataInizioposizione(Timestamp dataInizioposizione) {
        this.dataInizioposizione = dataInizioposizione;
    }
    public Timestamp getDataInizioAnno() {
        return dataInizioAnno;
    }
    public void setDataInizioAnno(Timestamp dataInizioAnno) {
        this.dataInizioAnno = dataInizioAnno;
    }
    public Timestamp getDataInizioTrimestre() {
        return dataInizioTrimestre;
    }
    public void setDataInizioTrimestre(Timestamp dataInizioTrimestre) {
        this.dataInizioTrimestre = dataInizioTrimestre;
    }
    public Timestamp getDataFinePosizione() {
        return dataFinePosizione;
    }
    public void setDataFinePosizione(Timestamp dataFinePosizione) {
        this.dataFinePosizione = dataFinePosizione;
    }
    public BigDecimal getQuotePuc() {
        return quotePuc;
    }
    public void setQuotePuc(BigDecimal quotePuc) {
        this.quotePuc = quotePuc;
    }
    public Timestamp getDataRiferimentoNavPUC() {
        return dataRiferimentoNavPUC;
    }
    public void setDataRiferimentoNavPUC(Timestamp dataRiferimentoNavPUC) {
        this.dataRiferimentoNavPUC = dataRiferimentoNavPUC;
    }
    public Timestamp getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(Timestamp timestamp) {
        this.timestamp = timestamp;
    }
    public BigDecimal getControvalorePUC() {
        return controvalorePUC;
    }
    public void setControvalorePUC(BigDecimal controvalorePUC) {
        this.controvalorePUC = controvalorePUC;
    }
    public Timestamp getDataRiferimentoNavTIR() {
        return dataRiferimentoNavTIR;
    }
    public void setDataRiferimentoNavTIR(Timestamp dataRiferimentoNavTIR) {
        this.dataRiferimentoNavTIR = dataRiferimentoNavTIR;
    }
    public Timestamp getDataRiferimentoFlusso() {
        return dataRiferimentoFlusso;
    }
    public void setDataRiferimentoFlusso(Timestamp dataRiferimentoFlusso) {
        this.dataRiferimentoFlusso = dataRiferimentoFlusso;
    }
}

然后我有这个 MainApp 类(只是获取名为 PucManager pucManager 的DAO类):

public class MainApp {

    private PucManager pucManager;

    public static void main(String[] args) {

        new MainApp().execute(); 

    }

    private void execute() {
        GenericXmlApplicationContext context = new GenericXmlApplicationContext();
        ConfigurableEnvironment conf = (ConfigurableEnvironment) context.getEnvironment();
        conf.setActiveProfiles("PROD"); 
        context.load("applicationContext.xml");
        context.refresh();

        HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
        obj.getMessage();

        pucManager = (PucManager) context.getBean("pucManager");

        List<TassoRendimentoInterno> tassoRendimentoInternoList = pucManager.getTassoRendimentoInterno();

        List<TassoInternoRendimentoFondo> tassoInternoRendimentoFondoList = pucManager.getTassoRendimentoInternoFondo();

        System.out.println("BATCH TERMINATO");
    }
}

这是我的 PucManager 类:

@Service
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public class PucManager extends JdbcDaoSupport {

    private static Logger log = Logger.getLogger(PucManager.class);
    private Connection con;

    public PucManager() {
        System.out.println("Costruzione PucManager");
    }

    @Autowired
    public PucManager(@Qualifier("dataSourcePUC") DataSource dataSource) {
        setDataSource(dataSource);

    }

    public String testMethod() {
        return "TEST OK";
    }


    public List<TassoRendimentoInterno> getTassoRendimentoInterno() {

        String sql = "select *  from puc001.TassoRendimentoInterno "
                   + "where Polizzaid in ( select id from polizza where prodottoid = '6v0u1' )";

        List<TassoRendimentoInterno> tassoRendimentoInternoList  = getJdbcTemplate().query(sql, new BeanPropertyRowMapper(TassoRendimentoInterno.class));

        return tassoRendimentoInternoList;

    }

    public List<TassoInternoRendimentoFondo> getTassoRendimentoInternoFondo() {

        String sql = "select *  from puc001.TassoInternoRendimentoFondo "
                   + "where Polizzaid in ( select id from polizza where prodottoid = '6v0u1' )";

        List<TassoInternoRendimentoFondo> tassoInternoRendimentoFondoList  = getJdbcTemplate().query(sql, new BeanPropertyRowMapper(TassoInternoRendimentoFondo.class));

        return tassoInternoRendimentoFondoList;

    }

}

问题在于,当它尝试将此指令执行到 getTassoRendimentoInterno()方法时:

List<TassoRendimentoInterno> tassoRendimentoInternoList  = getJdbcTemplate().query(sql, new BeanPropertyRowMapper(TassoRendimentoInterno.class));

我在stacktrace中获得了这个摘要:

Exception in thread "main" org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.mycompany.beans.TassoRendimentoInterno]: Is it an abstract class?; nested exception is java.lang.InstantiationException: com.mycompany.beans.TassoRendimentoInterno
    at org.springframework.beans.BeanUtils.instantiate(BeanUtils.java:82)
    at org.springframework.jdbc.core.BeanPropertyRowMapper.mapRow(BeanPropertyRowMapper.java:235)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:92)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60)
    at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:446)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:396)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:456)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:464)
    at com.mycompany.dbmanager.PucManager.getTassoRendimentoInterno(PucManager.java:62)
    at com.mycompany.dbmanager.PucManager$$FastClassBySpringCGLIB$$d6a10e62.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:700)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:132)
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:633)
    at com.mycompany.dbmanager.PucManager$$EnhancerBySpringCGLIB$$fbae53e4.getTassoRendimentoInterno(<generated>)
    at com.mycompany.main.MainApp.execute(MainApp.java:37)
    at com.mycompany.main.MainApp.main(MainApp.java:21)
Caused by: java.lang.InstantiationException: com.mycompany.beans.TassoRendimentoInterno
    at java.lang.Class.newInstance0(Class.java:340)
    at java.lang.Class.newInstance(Class.java:308)
    at org.springframework.beans.BeanUtils.instantiate(BeanUtils.java:79)
    ... 19 more

为什么呢?怎么了?我错过了什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

根据BeanPropertyRowMapper

  

将行转换为新实例的RowMapper实现   指定的映射目标类。映射的目标类必须是a   顶级类,它必须具有默认或无参数构造函数。

您似乎错过了public class LogMessageTypeFilter : IFilter<ConsumeContext> { }

中的无参数构造函数