DELETE和GET在Jax-rsrestful应用程序中有错误行为
我正在通过一个教程项目学习如何实现RESTAPI 为了测试标准CRUD方法,我执行了一个例行程序,我面临着一个相当奇怪的行为 下面是代码体系结构的一般描述: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
- 我使用存根来模拟数据库行为,使用一个静态类,该类包含一个
,其中HashMap
是我正在操作的实体,Message
- 这个存根hashmap引用又被提供给一个类
,它执行CRUD方法实现的逻辑MessageService
- MessageService在类
中实例化,该类是包含所有MessageRessource
方法实现,调用@GET、@POST等的Rest API。
实例方法MessageService
- 这个存根hashmap引用又被提供给一个类
- 我应该指出,我在
构造函数中添加了两个硬编码的消息条目,并将其放入数据库存根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中的
方法不应该显示3个条目,而是 只有两个GET
- 也许这与没有返回数据这一事实有关
通过
,而DELETE
会返回添加的数据吗POST
注意:我知道这不是一个真正的问题,因为我只需要删除构造函数中的硬编码
消息
项,就可以正常执行。但是我真的很好奇这个例程出现故障的原因。您假设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"));
}