当前位置: 首页 > 知识库问答 >
问题:

为什么在这个Spring应用程序中使用JdbcTemplate BeanPropertyRowMapper类时会获得这个实例化异常?

江飞章
2023-03-14

我正在使用Spring开发一个批处理,我在尝试使用Sping JdbcTemboard和BeanProperty tyRowMapper Spring类从查询中获取对象列表时遇到了一些问题,该类将类的属性与数据库表的字段进行映射。

因此,在我的数据库(MicrosoftSQLServer)上,我有一个名为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;

    }

}

问题是,当它尝试将此指令执行到gettassorendmentointerno()方法中时:

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

我在stacktraces中获得此Excption:

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个答案

丌官高远
2023-03-14

据BeanPropertyRowMapper称,

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

看起来您在TassoRendimentoInterno中缺少了无参数构造函数

 类似资料:
  • 我有这个项目。然后我做以下步骤: 转到 预期结果:错误消息(在浏览器中呈现) 白标签错误页 此应用程序没有 /error的显式映射,因此您将此视为一种退回。星期二八月27 16:59:23CEST 2019有一个意外的错误(类型=未找到,状态=404)。没有可用的消息 如何更改附加的代码,使文件索引代替此错误。是否呈现xhtml? 更新1:如果我去,我得到这个错误: 白标签错误页此应用程序没有/E

  • 我需要帮助我的错误就像 代码:

  • 我完全是以编程的方式在iOS中工作,也完全是使用IB,但我第一次尝试将两者混合使用,我感到困惑。我正在写一个标签应用程序。在我的应用程序委托中,我曾经有以下代码: 那很好。 然后,我通过IB中的故事板创建了一个视图控制器,并向其添加了一堆用户界面元素,给出了以下设置: 现在我的代码是: 应用程序可以正常启动,但当我按tab键进入设置屏幕时,会收到以下消息: 这意味着什么?我如何修复它? 编辑:这里

  • 详细信息:对于我开发的很多程序,我使用此代码(或一些轻微的变体)每隔一段时间“勾选”一个方法,设置为可变tps(如果设置为32,则每秒调用该方法滴答32次)。它非常重要,所以我不能从我的代码中删除它,因为动画和其他各种部分会损坏。 不幸的是,它似乎使用了大量的cpu,原因我不知道。不久前,我在考虑使用thread.sleep()来解决这个问题,但根据这篇文章;它相当不准确,这使得它不可行,因为这需

  • 我知道我在这里有点手足无措,但我似乎不明白为什么我们不能创建两次Scanner类的实例。我将添加一个示例以防万一。 我会得到一个运行时错误,如下所示 我知道再次创建同一个类的新对象是没有意义的,鼓励冗余。但我只是觉得如果我知道为什么会让我头脑清醒,你不是也这么认为吗? 机器所说的“java.util.NosuchelementException:No line found”是什么意思,人们说扫描器

  • 我想做一个APK的网络应用程序,我把它包装成Cordova。我遵循了各种教程,安装了Gradle并使其工作。 当我从CMD运行时,我会得到以下错误: