首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在发送GET请求时出错,但在POST上工作

在发送GET请求时出错,但在POST上工作
EN

Stack Overflow用户
提问于 2022-09-07 06:18:33
回答 3查看 65关注 0票数 1

我有一个REST链接到一个Java应用程序,该应用程序使用JDBC连接到数据库,我目前正在通过Swagger进行测试。

发送post请求完全正常,当给定类型的表为空时发送GET请求似乎也返回一个正常的响应,但是一旦在表中有数据时发送GET请求,则会得到以下错误。

代码语言:javascript
复制
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 omitted

PersonModule的第23行被声明为抛出错误,它有以下代码

代码语言:javascript
复制
 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代码是

代码语言:javascript
复制
    @Override
    @SqlQuery("SELECT * FROM PERSON ORDER BY EMAIL")
    @RegisterBeanMapper(Person.class)
    public Collection<Person> getPersons();

Person.class有以下代码(还包括普通的getter和setter方法)

代码语言:javascript
复制
 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的单元测试也通过,没有错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-07 07:12:56

我发现了这个问题,

我域类中的构造函数似乎是错误,我在当前的Person.class中添加了一个空的构造函数来修正这个错误

代码语言:javascript
复制
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;
    }

现在它很好用。如果有人能解释这是为什么,我很想知道:)

票数 1
EN

Stack Overflow用户

发布于 2022-09-07 06:32:00

尝试SQL查询中的实际列名。而不是这样:

代码语言:javascript
复制
SELECT * FROM PERSON ORDER BY EMAIL

试试这个:

代码语言:javascript
复制
SELECT PERSONID, EMAIL, PASSWORD,... FROM PERSON ORDER BY EMAIL
票数 0
EN

Stack Overflow用户

发布于 2022-09-07 07:12:06

您应该从错误输出中获得本质。

它与构造函数INIT中的lambda代码相关,没有这样的方法getPersons。

有了这个问题,代码应该有一个异常包装或添加到构造函数声明开始,至少对于get请求代码,例如抛出ServletException和UnavailableException。

代码语言:javascript
复制
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的类型是什么。

代码语言:javascript
复制
@Override
@SqlQuery("SELECT * FROM PERSON ORDER BY EMAIL")
@RegisterBeanMapper(Person.class)
public Collection<Person> getPersons();

不知怎么的,Person类的所有必需构造函数参数都是在一篇文章中发送的,但是在get中没有人类是在代码中创建的,我发现奇怪的是,它没有继续抛出错误,不管您是否给它一个抽象类的无参数构造函数,但不知道它是否被视为抽象类,更正常的方法是生成DTO数据传输对象模板和

在DAO数据访问对象类之间的实体,具有要调用的接口。而且,getPersons集合似乎没有任何用处,所以为什么要进行大规模的查询检索。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73630872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档