java - 通过 spring-boot [JAVA] 从 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'));
Seans 类(我在这里使用了 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));
}
}
有人遇到过这种错误,知道如何修复吗?
解决方案
从您的错误日志中,
Caused by: java.lang.NoSuchMethodException: com.exam.kino.database.Seans.<init>()
它正在寻找一个默认的构造函数。尝试在 Seans 类中定义一个默认构造函数。
使用 spring boot 获取数据的建议
您可以将 CRUDRepository 或 JPARepository 扩展到您的 Repository 类以获取数据。存储库将构建表并自行查询。
推荐阅读
- java - Vert.x 两个服务之间的 Http 延迟
- angular - 自动关闭警报角度 SPA
- awk - 用于 NS2 的 AWK 脚本,用于计算信令百分比和网络/信道利用率
- delphi - 在两个 IDE 中调试进程的不同部分
- sql-server - 对于 xml 路径返回 null 而不是什么都没有
- delphi - Delphi中卡方分布函数的代码
- android - 无法调用 AWS 段,因为无法导入 AmazonPinpointClientBuilder
- google-apps-script - Google Apps 脚本在 onFormSubmit 上失败并有并发响应
- javascript - 引导数据切换在页面加载时不起作用
- mysql - 连接Mysql中的三个表相互依赖