DELETE和GET在Jax-rsrestful应用程序中有错误行为

DELETE和GET在Jax-rsrestful应用程序中有错误行为,rest,jakarta-ee,jax-rs,Rest,Jakarta Ee,Jax Rs,我正在通过一个教程项目学习如何实现RESTAPI 为了测试标准CRUD方法,我执行了一个例行程序,我面临着一个相当奇怪的行为 下面是代码体系结构的一般描述: 我使用存根来模拟数据库行为,使用一个静态类,该类包含一个HashMap,其中Message是我正在操作的实体, 这个存根hashmap引用又被提供给一个类MessageService,它执行CRUD方法实现的逻辑 MessageService在类MessageRessource中实例化,该类是包含所有@GET、@POST等的Rest A

我正在通过一个教程项目学习如何实现RESTAPI

为了测试标准CRUD方法,我执行了一个例行程序,我面临着一个相当奇怪的行为

下面是代码体系结构的一般描述:

  • 我使用存根来模拟数据库行为,使用一个静态类,该类包含一个
    HashMap
    ,其中
    Message
    是我正在操作的实体,
    • 这个存根hashmap引用又被提供给一个类
      MessageService
      ,它执行CRUD方法实现的逻辑
    • MessageService在类
      MessageRessource
      中实例化,该类是包含所有
      @GET、@POST等的Rest API。
      方法实现,调用
      MessageService
      实例方法
  • 我应该指出,我在
    MessageService
    构造函数中添加了两个硬编码的消息条目,并将其放入数据库存根
    HashMap
现在,这是让我感到困惑的例行公事:

  • 运行应用程序
  • /messages
    上执行
    GET
    :显示2个条目
  • 使用自定义数据执行
    POST
    :添加数据
  • /messages
    上执行
    GET
    :显示3个条目
  • /messages/3
    上执行
    删除
    :删除第三个条目
  • /messages
    上执行
    GET
    :显示2个条目
  • /messages/2上执行
    删除
    :调试应用程序时
    
    messagesource
    中的
    messageService
    实例在处理
    DELETE
    方法后具有大小为1的哈希映射
  • /messages
    执行
    GET
    :显示2个条目,而不是1个条目
  • 我对这个问题的看法是:

    • 如果包含硬编码数据的构造函数是导致 问题是,步骤4中的
      GET
      方法不应该显示3个条目,而是 只有两个
    • 也许这与没有返回数据这一事实有关 通过
      DELETE
      ,而
      POST
      会返回添加的数据吗
    有关代码,请参阅中的GitHub公共项目


    注意:我知道这不是一个真正的问题,因为我只需要删除构造函数中的硬编码
    消息
    项,就可以正常执行。但是我真的很好奇这个例程出现故障的原因。

    您假设JAX-RS容器将只创建服务的一个实例
    MessageResource
    ,但它可以决定清理实例或创建多个实例。每次完成初始化时,您的静态
    消息
    将更新为另外两个条目。结果是不确定的

    @Path("/messages")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public class MessageRessource {
    
        private MessageService messageService;
    
        public MessageRessource() {
            messageService = new MessageService();
        }
    


    附言:发布你的代码而不是链接它

    ,因此不可预测性转化为正确的发布行为,但错误的删除行为(即使每次我测试的结果完全相同),你能告诉我如何选择我的代码,以便把最相关的部分,而不妨碍后。我的意思是,结果是不确定的先验。您不知道容器将如何以及何时管理实例。可能在相同的输入下,结果是可预测的。但是通过改变JAX-RS的版本,应用服务器甚至JVM可以改变行为。最好不要使用这些实践,我建议删除对代码如何工作的解释,并包含您正在谈论的代码片段:
    TestResource
    (just和GET、POST和DELETE片段)、
    MessageService
    的构造函数和静态变量。解释可能会被误解,代码通常是不言自明的
    public MessageService() {
        messages.put(1L, new Message(1L,"Hi","Imad"));
        messages.put(2L, new Message(2L,"Hello","Badr"));
    }