java - 通过spring-boot从h2数据库获取数据[JAVA]

标签 java spring-boot h2

我正在学习java spring。现在我正在尝试从数据库中检索数据。我靠这个教程https://dzone.com/articles/spring-boot-and-spring-jdbc-with-h2

当我尝试通过 ID 从数据库获取数据时,出现此错误:

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run(AbstractRunMojo.java:542)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:782)
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:763)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1213)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1202)
    at com.exam.kino.KinoApplication.main(KinoApplication.java:25)
    ... 6 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.exam.kino.database.Seans]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.exam.kino.database.Seans.<init>()
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:129)
    at org.springframework.jdbc.core.BeanPropertyRowMapper.mapRow(BeanPropertyRowMapper.java:285)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:94)
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:61)
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:678)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:616)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:668)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:699)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:711)
    at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:782)
    at com.exam.kino.repository.SeansRepository.findById(SeansRepository.java:26)
    at com.exam.kino.repository.SeansRepository$$FastClassBySpringCGLIB$$a208ec27.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.exam.kino.repository.SeansRepository$$EnhancerBySpringCGLIB$$b326407c.findById(<generated>)
    at com.exam.kino.KinoApplication.run(KinoApplication.java:31)
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:779)
    ... 11 more
Caused by: java.lang.NoSuchMethodException: com.exam.kino.database.Seans.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:122)
    ... 31 more

这是我的数据库(schema.sql 和 import.sql):

create table seans
(
   id integer not null AUTO_INCREMENT,
   title varchar(255) not null,
   datetime TIMESTAMP not null,
   primary key(id)
);
INSERT INTO seans (id, title, DATETIME) VALUES (1,'Captain America',parsedatetime('30-06-2016 08:00', 'dd-MM-yyyy hh:mm'));
INSERT INTO seans (id, title, DATETIME) VALUES (2,'Antman',parsedatetime('30-06-2016 10:00', 'dd-MM-yyyy hh:mm'));
INSERT INTO seans (id, title, DATETIME) VALUES (3,'Ironman',parsedatetime('30-06-2016 12:00', 'dd-MM-yyyy hh:mm'));

Seas 类(我在这里使用了 Lombok 和注释 @Data):

package com.exam.kino.database;

import java.sql.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import lombok.Data;

@Data
@Table(name="seans")
@Entity
public class Seans {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;
    @Column(name = "title")
    private String title;
    @Column(name = "datetime")
    private Date datetime;

    public Seans(int id, String title, Date datetime) {
        super();
        this.id = id;
        this.title = title;
        this.datetime = datetime;
    }
}

我的存储库类:

package com.exam.kino.repository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.exam.kino.database.Seans;

import antlr.collections.List;

@Repository
public class SeansRepository
{
    @Autowired
    JdbcTemplate jdbcTemplate;
    public Seans findById(long id) {
        return jdbcTemplate.queryForObject("select * from seans where id=? ", new Object[] {
                id
        },new BeanPropertyRowMapper<Seans>(Seans.class));
    }
}

最后一个带有方法调用的主类:

package com.exam.kino;
import org.slf4j.Logger;

import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.exam.kino.repository.SeansRepository;

@SpringBootApplication
public class KinoApplication implements CommandLineRunner {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    SeansRepository repository;

    public static void main(String[] args) {
        SpringApplication.run(KinoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        logger.info("Seans id 1 - > {}", repository.findById(1));
    }
}

有人遇到过这种类型的错误并且知道如何修复它吗?

最佳答案

您可以通过添加一个注释来让 Lombok 创建 no-arg-constructor:

@Data
@NoArgsConstructor
@Table(name="seans")
@Entity
public class Seans {
  // ...
}

}

并且不要声明您自己的构造函数; @NoArgsConstructor@RequiredArgsConstructor(通过使用 @Data 隐式实现)仅在您没有自定义构造函数时才有效。

关于java - 通过spring-boot从h2数据库获取数据[JAVA],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57451466/

相关文章:

java - Jboss AS 7.1.1 访问/查询嵌入式 H2 数据库

java - 在考虑业务需求变化的情况下,POJO/模型或领域驱动对象的本质到底是什么?

java - 使用哪个 HTTP 动词来触发 Kafka 消息的发布

java - Spring boot 1.5.2 - 加载 Logo 后 Web 应用程序停止?

java - Spring 启动 : Oracle RAC DB connection configuration

java - 在 h2 数据库中插入 View

sql - 如何在Linux/Grails/Groovy环境中的Grails h2数据源中 “look at data”?

java - Hibernate 抛出无法删除或更新父行异常

java - 如何让KafkaProducer使用模拟的模式注册表进行测试?

java - 如何在 ibatis sqlMap 配置中使用文件资源而不是类路径资源?