DELETE和GET在Jax-RS Restful App中有错误的行为

时间:2017-01-20 12:47:34

标签: rest java-ee jax-rs

我正在学习如何通过教程项目实现Rest API。

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

以下是代码架构的一般描述:

  • 我使用存根来模拟使用静态类的数据库行为,该静态类包含HashMap<Long, Message>,其中Message是我正在操作的实体,
    • 这个存根hashmap引用又被赋予一个类MessageService,它执行CRUD方法实现的逻辑,
    • MessageService在类MessageRessource中实例化,这是Rest API,包含调用@GET, @POST, etc...实例方法的所有MessageService方法实现。
  • 我应该指出,我在MessageService构造函数中添加了2个硬编码的消息条目,我将其放入数据库存根HashMap

现在,这里的例程让我感到困惑:

  1. 运行app,
  2. GET上执行/messages:显示2个条目,
  3. 使用自定义数据执行POST:添加数据,
  4. GET上执行/messages:显示3个条目,
  5. DELETE上执行/messages/3:删除第三个条目,
  6. GET上执行/messages:显示2个条目,
  7. DELETE上执行/messages/2:在调试应用时, 在messageService处理MessageRessource方法后,DELETE中的GET实例具有大小为1的哈希图,
  8. /messages上执行GET:显示2个条目而不是1个。
  9. 我对这个问题的看法:

    • 如果包含硬编码数据的构造函数是原因 问题是,步骤4中的DELETE方法不应该显示3个条目,但是 只有2。
    • 也许这与没有返回数据的事实有关 在POST确实返回添加的数据的同时Message

    有关代码,请参阅messenger App by AetosAkrivis

    中的GitHub公共项目

    N.B:我知道这不是一个真正的问题,因为我只需要删除构造函数中的硬编码 function addEventData(auth) { var sheets = google.sheets('v4'); sheets.spreadsheets.values.append({ auth: auth, spreadsheetId: spreadsheetId, range: 'Sheet1!A:B', valueInputOption:'USER_ENTERED', insertDataOption:'INSERT_ROWS', alt:'json' }, { values:[['xoxo', '12']] }, function(err, response){ if(err){ console.log('The api returned an error:'+err); return } console.log(response); }) } 条目,以便能够正常执行。但我真的很好奇这个例程出现故障的原因。

1 个答案:

答案 0 :(得分:1)

您假设JAX-RS容器只会创建一个服务MessageRessource的实例,但它可以决定清理实例或创建多个实例。每次完成初始化时,静态messages将更新2个附加条目。结果是不确定的

@Path("/messages")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class MessageRessource {

    private MessageService messageService;

    public MessageRessource() {
        messageService = new MessageService();
    }
public MessageService() {
    messages.put(1L, new Message(1L,"Hi","Imad"));
    messages.put(2L, new Message(2L,"Hello","Badr"));
}

P.S:发布您的代码而不是链接