我有一个REST链接到一个Java应用程序,该应用程序使用JDBC连接到数据库,我目前正在通过Swagger进行测试。
发送post请求完全正常,当给定类型的表为空时发送GET请求似乎也返回一个正常的响应,但是一旦在表中有数据时发送GET请求,则会得到以下错误。
GET /api/user 500 Server Error
java.lang.reflect.UndeclaredThrowableException: null
at jdk.proxy2/jdk.proxy2.$Proxy16.getPersons(Unknown Source)
at module.PersonModule.lambda$new$41b6884b$1(PersonModule.java:23)
at io.jooby.internal.handler.DefaultHandler.apply(DefaultHandler.java:23)
at io.jooby.internal.handler.WorkerHandler.lambda$apply$0(WorkerHandler.java:23)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.NoSuchMethodException: no such constructor: domain.Person.<init>()void/newInvokeSpecial
at java.base/java.lang.invoke.MemberName.makeAccessException(MemberName.java:974)
at java.base/java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1117)
at java.base/java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:3649)
at java.base/java.lang.invoke.MethodHandles$Lookup.findConstructor(MethodHandles.java:2750)
at org.jdbi.v3.core.mapper.reflect.internal.BeanPropertiesFactory$BeanPojoProperties$PropertiesHolder.<init>(BeanPropertiesFactory.java:202)
at org.jdbi.v3.core.config.JdbiCaches.lambda$declare$0(JdbiCaches.java:49)
at org.jdbi.v3.core.config.JdbiCaches$1.lambda$get$1(JdbiCaches.java:63)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at org.jdbi.v3.core.config.JdbiCaches$1.get(JdbiCaches.java:63)
at org.jdbi.v3.core.mapper.reflect.internal.BeanPropertiesFactory$BeanPojoProperties.getProperties(BeanPropertiesFactory.java:81)
at org.jdbi.v3.core.mapper.reflect.internal.PojoMapper.specialize0(PojoMapper.java:99)
at org.jdbi.v3.core.mapper.reflect.internal.PojoMapper.specialize(PojoMapper.java:80)
at org.jdbi.v3.core.result.ResultSetResultIterator.<init>(ResultSetResultIterator.java:38)
at org.jdbi.v3.core.result.ResultIterable.lambda$of$0(ResultIterable.java:54)
at org.jdbi.v3.core.result.ResultIterable.stream(ResultIterable.java:228)
at org.jdbi.v3.core.result.ResultIterable.collect(ResultIterable.java:284)
at org.jdbi.v3.sqlobject.statement.internal.ResultReturner$CollectedResultReturner.mappedResult(ResultReturner.java:275)
at org.jdbi.v3.sqlobject.statement.internal.SqlQueryHandler.lambda$configureReturner$0(SqlQueryHandler.java:61)
at org.jdbi.v3.sqlobject.statement.internal.CustomizingStatementHandler.invoke(CustomizingStatementHandler.java:178)
at org.jdbi.v3.sqlobject.statement.internal.SqlQueryHandler.invoke(SqlQueryHandler.java:27)
at org.jdbi.v3.sqlobject.internal.SqlObjectInitData$1.lambda$invoke$0(SqlObjectInitData.java:132)
at org.jdbi.v3.core.internal.Invocations.invokeWith(Invocations.java:44)
at org.jdbi.v3.core.internal.Invocations.invokeWith(Invocations.java:26)
at org.jdbi.v3.core.LazyHandleSupplier.lambda$invokeInContext$1(LazyHandleSupplier.java:77)
at org.jdbi.v3.core.internal.Invocations.invokeWith(Invocations.java:44)
at org.jdbi.v3.core.internal.Invocations.invokeWith(Invocations.java:26)
at org.jdbi.v3.core.LazyHandleSupplier.invokeInContext(LazyHandleSupplier.java:76)
at org.jdbi.v3.sqlobject.internal.SqlObjectInitData$1.call(SqlObjectInitData.java:138)
at org.jdbi.v3.sqlobject.internal.SqlObjectInitData$1.invoke(SqlObjectInitData.java:132)
at org.jdbi.v3.sqlobject.SqlObjectFactory.lambda$attach$2(SqlObjectFactory.java:110)
at org.jdbi.v3.core.internal.OnDemandExtensions.lambda$invoke$5(OnDemandExtensions.java:98)
at org.jdbi.v3.core.internal.exceptions.Unchecked.lambda$function$4(Unchecked.java:76)
at org.jdbi.v3.core.internal.OnDemandExtensions.invoke(OnDemandExtensions.java:98)
at org.jdbi.v3.core.internal.OnDemandExtensions.lambda$createProxy$2(OnDemandExtensions.java:82)
at org.jdbi.v3.core.Jdbi.callWithExtension(Jdbi.java:476)
at org.jdbi.v3.core.Jdbi.withExtension(Jdbi.java:463)
at org.jdbi.v3.core.internal.OnDemandExtensions.lambda$createProxy$3(OnDemandExtensions.java:82)
... 8 common frames omitted
Caused by: java.lang.NoSuchMethodError: domain.Person: method 'void <init>()' not found
at java.base/java.lang.invoke.MethodHandleNatives.resolve(Native Method)
at java.base/java.lang.invoke.MemberName$Factory.resolve(MemberName.java:1085)
at java.base/java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1114)
... 43 common frames omittedPersonModule的第23行被声明为抛出错误,它有以下代码
public PersonModule(PersonDAO dao){
path("/api/user", () -> {
get("", ctx -> {
return dao.getPersons();
});
post("", ctx -> {
Person person = ctx.body().to(Person.class);
if (dao.getPerson(person.getEmail()) == null) {
dao.savePerson(person);
return ctx.send(StatusCode.CREATED);
} else {
return ctx
.setResponseCode(StatusCode.UNPROCESSABLE_ENTITY)
.render(new ErrorMessage("That email already exists in the system"));
}
});
});return dao.getPersons()为第23行
用于获取人员的JDBI代码是
@Override
@SqlQuery("SELECT * FROM PERSON ORDER BY EMAIL")
@RegisterBeanMapper(Person.class)
public Collection<Person> getPersons();Person.class有以下代码(还包括普通的getter和setter方法)
public Person(Integer personID, String email, String password, String firstName, String lastName, String phone, String mobile, String industry, String bio, String city, Boolean active, String findOut, String role, String notes) {
this.personID = personID;
this.email = email;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
this.phone = phone;
this.mobile = mobile;
this.industry = industry;
this.bio = bio;
this.city = city;
this.active = active;
this.findOut = findOut;
this.role = role;
this.notes = notes;
}能帮我找出问题所在吗?
备注:GET请求在稍早的时候进行了测试,并且似乎运行良好,即使数据库中的数据也是如此。DAO的单元测试也通过,没有错误。
发布于 2022-09-07 07:12:56
我发现了这个问题,
我域类中的构造函数似乎是错误,我在当前的Person.class中添加了一个空的构造函数来修正这个错误
public Person(){
}
public Person(Integer personID, String email, String password, String firstName, String lastName, String phone, String mobile, String industry, String bio, Boolean active, String city, String findOut, String role, String notes) {
this.personID = personID;
this.email = email;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
this.phone = phone;
this.mobile = mobile;
this.industry = industry;
this.bio = bio;
this.city = city;
this.active = active;
this.findOut = findOut;
this.role = role;
}现在它很好用。如果有人能解释这是为什么,我很想知道:)
发布于 2022-09-07 06:32:00
尝试SQL查询中的实际列名。而不是这样:
SELECT * FROM PERSON ORDER BY EMAIL试试这个:
SELECT PERSONID, EMAIL, PASSWORD,... FROM PERSON ORDER BY EMAIL发布于 2022-09-07 07:12:06
您应该从错误输出中获得本质。
它与构造函数INIT中的lambda代码相关,没有这样的方法getPersons。
有了这个问题,代码应该有一个异常包装或添加到构造函数声明开始,至少对于get请求代码,例如抛出ServletException和UnavailableException。
GET /api/user 500 Server Error
java.lang.reflect.UndeclaredThrowableException: null
at jdk.proxy2/jdk.proxy2.$Proxy16.getPersons(Unknown Source)
at module.PersonModule.lambda$new$41b6884b$1(PersonModule.java:23)
path("/api/user", () -> {
get("", ctx -> {
return dao.getPersons();
});下面的操作引用了使用getPersons方法将所有人员都放到Collection对象上的奇怪操作,但是除了返回它之外,您什么也不做--我猜想它是" ctx “,不幸的是,您并没有说对象ctx的类型是什么。
@Override
@SqlQuery("SELECT * FROM PERSON ORDER BY EMAIL")
@RegisterBeanMapper(Person.class)
public Collection<Person> getPersons();不知怎么的,Person类的所有必需构造函数参数都是在一篇文章中发送的,但是在get中没有人类是在代码中创建的,我发现奇怪的是,它没有继续抛出错误,不管您是否给它一个抽象类的无参数构造函数,但不知道它是否被视为抽象类,更正常的方法是生成DTO数据传输对象模板和
在DAO数据访问对象类之间的实体,具有要调用的接口。而且,getPersons集合似乎没有任何用处,所以为什么要进行大规模的查询检索。
https://stackoverflow.com/questions/73630872
复制相似问题