为什么我在这个 Spring 应用程序中使用 JdbcTemplate BeanPropertyRowMapper class 时得到这个 InstantiationException?

Why I obtain this InstantiationException when I use the JdbcTemplate BeanPropertyRowMapper class in this Spring application?

我正在处理使用 Spring 开发的批处理,我在尝试使用 Sping JdbcTemplate 和 [=34 从查询中获取对象列表时遇到了一些问题=]BeanPropertyRowMapper Spring class 映射 class 的 属性 与数据库的字段 table.

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

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

然后我将此 table 映射到名为 TassoRendimentoInterno:

的 class
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 class(简单地获取名为 PucManager pucManager 的 DAO class) :

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 class:

@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));

我在堆栈跟踪中获得了这个异常:

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.JdbcTemplateQueryStatementCallback.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

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

根据BeanPropertyRowMapper

RowMapper implementation that converts a row into a new instance of the specified mapped target class. The mapped target class must be a top-level class and it must have a default or no-arg constructor.

看起来你错过了 TassoRendimentoInterno

中的无参数构造函数