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

hibernate-orm-panache-resteacy:{"错误":"加载需要id to load","代码": 500}运行本机构建

夔光霁
2023-03-14

在我尝试使用hibernate ORM和panache测试quarkus的一个小型rest服务之后,我在构建一个本机可执行文件并在docker容器中运行它之后,遇到了一个错误。关键是,它在开发模式下工作得很好,但在构建本机之后就不行了。

我使用的代码是从水果示例中复制并更改为人。我在docker容器中使用postgres db。数据库通过import.sql用一些数据初始化如果我在开发模式下运行它,我可以在http://localhost:8080/person上发出请求,并获得所有人的列表,如果我发出请求,例如在http://localhost:8080/person/2/我得到的人与id 2.在本机构建之后,我在docker容器中运行该服务。有了同样的请求,我得到了所有人的列表,但是如果我想得到例如id 2的人,我得到了一个带有错误的响应代码500:{"错误":"id to load是加载所必需的","code": 500}id为2的人存在于db中。

import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import javax.json.Json;
import javax.transaction.Transactional;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import org.jboss.resteasy.annotations.jaxrs.PathParam;

import io.quarkus.panache.common.Sort;

/**
 * PersonResource
 */
@Path("person")
@ApplicationScoped
@Produces("application/json")
@Consumes("application/json")
public class PersonResource {

    @GET
    public List<Person> get() {
        return Person.listAll(Sort.by("lastName"));
    }

    @GET
    @Path("{id}")
    public Person getSingle(@PathParam Long id) {
        Person entity = Person.findById(id);
        if (entity == null) {
            throw new WebApplicationException("Person with id of " + id + " does not exist.", 404);
        }
        return entity;
    }

    @POST
    @Transactional
    public Response create(Person person) {
        if (person.id != null) {
            throw new WebApplicationException("Id was invalidly set on request.", 422);
        }
        person.persist();
        return Response.ok(person).status(201).build();
    }

    @PUT
    @Path("{id}")
    @Transactional
    public Person update(@PathParam Long id, Person person) {
        if (person.firstName == null || person.lastName == null) {
            throw new WebApplicationException("First Name or Last Name was not set on request.", 422);
        }

        Person entity = Person.findById(id);

        if (entity == null) {
            throw new WebApplicationException("Person with id of " + id + " does not exist.", 404);
        }

        entity.firstName = person.firstName;
        entity.lastName = person.lastName;

        return entity;
    }

    @DELETE
    @Path("{id}")
    @Transactional
    public Response delete(@PathParam Long id) {
        Person entity = Person.findById(id);
        if (entity == null) {
            throw new WebApplicationException("Person with id of " + id + " does not exist.", 404);
        }
        entity.delete();
        return Response.status(204).build();
    }


    @Provider
    public static class ErrorMapper implements ExceptionMapper<Exception> {

        @Override
        public Response toResponse(Exception exception) {
            int code = 500;
            if (exception instanceof WebApplicationException) {
                code = ((WebApplicationException) exception).getResponse().getStatus();
            }
            return Response.status(code)
                    .entity(Json.createObjectBuilder().add("error", exception.getMessage()).add("code", code).build())
                    .build();
        }

    }

}

以下是请求和响应:

$ curl -v -X GET 'http://localhost:8080/person'
Note: Unnecessary use of -X or --request, GET is already inferred.
* Uses proxy env variable no_proxy == 'localhost,127.0.0.1,*sulzer.de'
*   Trying ::1:8080...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /person HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.65.3
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Connection: keep-alive
< Content-Type: application/json
< Content-Length: 154
< Date: Tue, 13 Aug 2019 09:15:14 GMT
< 
* Connection #0 to host localhost left intact
[{"id":2,"firstName":"Muster","lastName":"Maxmann"},{"id":1,"firstName":"Max","lastName":"Mustermann"},{"id":3,"firstName":"Mann","lastName":"Mustermax"}]


$ curl -v -X GET 'http://localhost:8080/person/2'
Note: Unnecessary use of -X or --request, GET is already inferred.
* Uses proxy env variable no_proxy == 'localhost,127.0.0.1,*sulzer.de'
*   Trying ::1:8080...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /person/2 HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.65.3
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 500 Internal Server Error
< Connection: keep-alive
< Content-Type: application/json
< Content-Length: 57
< Date: Tue, 13 Aug 2019 09:15:24 GMT
< 
* Connection #0 to host localhost left intact
{"error":"id to load is required for loading","code":500}

共有2个答案

步建茗
2023-03-14

如RESTEasy文档中所述,如果使用新注释,则需要让编译器生成参数名。将此添加到您的pom。xml

    <properties>
        <maven.compiler.parameters>true</maven.compiler.parameters>
    </properties>
严嘉良
2023-03-14

您可以尝试使用javax.ws.rs.PathParam而不是org.jboss.resteasy.annotations.jaxrs.PathParam吗?

org。jboss。放松点。注释。贾克斯。PathParam没有被考虑在内,因此您最终将null传递给您的方法,并且Hibernate ORM with Panache抱怨在您尝试加载实体时没有提供id。

我会看看我们是否可以改善这里的可用性,因为我最近也遇到了同样的问题。

 类似资料:
  • 问题内容: 我是tensorflow的新手,今天我使用以下命令安装了tensorflow: 当我尝试导入tensorflow时,它抛出: 我正在使用python 3.5.2 64bit,我真的不知道为什么导入过程会引发错误,请帮我指导 谢谢,最好的问候 问题答案: 只需下载MSVCP140.dll,解压缩,然后将其粘贴到system32文件夹中即可。

  • 问题内容: 我有一个PHP加密功能。我需要一个Java计数器部分。由于我对PHP的了解有限,因此无法理解。有人会两种语言,请帮忙。 PHP代码: 在此先感谢Aniruddha 问题答案: 这应该做。 Java中的MCRYPT_RIJNDAEL_128和MCRYPT_MODE_CBC等效于AES / CBC / NoPadding。您还需要一个用于Base64编码的实用程序,以上代码在Apache

  • 当我想运行反应-本机运行-Android命令我看到 失败:构建失败,有一个异常。 > 哪里出错了:配置根项目'reactNativeCliTest'时出现问题。 无法解析配置“:classpath”的所有依赖项。无法下载gradle core。jar(com.android.tools.build:gradle-core:2.2.3)无法获取资源的https://jcenter.bintray.c

  • 问题内容: 我从我不理解的Java编译器中收到一条错误消息。我已经在OSX 10.6、10.9和Ubuntu 14.04以及Java 6和7上测试了我的代码。当我使用Eclipse调试器或从解释器(使用-Xint选项)运行时,一切运行正常。否则,我将收到以下消息: Java 1.6: Java 1.7: Java 7的错误输出更多(已保存到文件中),但是不幸的是,我无法将其适合本文的字符数限制。有

  • 我有以下简化设置: 4)应用程序.属性 当我使用本机maven配置文件(mvn clean package-pnative)运行该文件时,我得到: 使用--report-unsupport-elements-at-runtime运行它也没有太大帮助。当我删除MyEntity类时,它在Mac+GRAALVM-CE-Java11-20.0.0上成功地编译为本机可执行文件

  • hibernate文档中说:“如果您希望利用运行时代理生成,那么至少应该使用包可见性来定义构造函数。”。我在hibernate文档中读到,hibernate可以增强字节码而不是代理创建(hibernate 5.x)。在任何情况下,它都可以用这种新方法代替代理创建?在哪些情况下需要生成运行时代理?