Spring Rest控制器轨迹实体视图计数
我需要跟踪实体视图计数。。例如,我有一个Spring Rest控制器轨迹实体视图计数,spring,rest,spring-mvc,spring-restcontroller,Spring,Rest,Spring Mvc,Spring Restcontroller,我需要跟踪实体视图计数。。例如,我有一个产品实体,并有以下API端点: GET /products/{productID} 如果我想跟踪特定产品的视图计数我是否应该添加额外的逻辑,在调用该/products/{productID}端点时增加视图计数?或者我应该为此引入一个单独的端点 已更新 也许我不清楚我的问题,但我的问题是关于使用RESTAPI更新计数器的最佳实践,而不是关于多层体系结构。我试图问以下问题-我应该通过提到的GET请求更新计数器,还是应该引入另一个API。。假设POST/pr
产品
实体,并有以下API端点:
GET /products/{productID}
如果我想跟踪特定产品的视图计数
我是否应该添加额外的逻辑,在调用该/products/{productID}
端点时增加视图计数?或者我应该为此引入一个单独的端点
已更新
也许我不清楚我的问题,但我的问题是关于使用RESTAPI更新计数器的最佳实践,而不是关于多层体系结构。我试图问以下问题-我应该通过提到的
GET
请求更新计数器,还是应该引入另一个API。。假设POST/products/{productID}/viewings
,然后在GET
之后调用它以更新计数器?这似乎是AOP(面向方面编程)的一个好方案,因为这将允许您将此统计逻辑与业务逻辑分离
查看更多关于AOP的信息,以及如何使用Spring实现AOP
然后,您可以在控制器上定义一个切入点,并提供一个计算(可能然后存储)数据的服务。关于如何在SpringMVC中使用RestController,下面是一个快速启动示例(使用
products/{id}
和一个JSON/XML req方法,JSON是一个直接的/id,XML是/id.XML)
关于视图计数,是的,我只想在控制器中添加额外的逻辑-可能比拦截器更干净/更简单。不要将计数放在控制器或AOP拦截器中;这两种方法都是解决这个问题的糟糕方法 您应该有一个数据源来提供关于给定产品(可能是数据库)的信息。 您应该使用JDBC包装器来访问数据库(可能是使用Hibernate或MyBatis编写的DAO)。 您还应该拥有一个由控制器调用的服务来检索给定的数据源(如GeneB答案中所示) 将访问计数放入数据库代码(DAO)或服务中
将计数存储在数据库中(可能创建AccessedProducts表)。理想情况下,它应该是后续调用,因为GET服务用于检索值。由于您在POST中有几乎相同的逻辑来更新计数,因此您可以使用以下相同的服务:
@RequestMapping(value = "/product/{id}", method = { RequestMethod.GET, RequestMethod.POST })
public Product getProduct(@PathVariable String id){
//get and update product
return product;
}
视图计数是产品实体的属性还是元数据
如果视图计数是一个属性,则考虑单独的<代码>放置<代码> >代码>补丁>代码>请求更新它。
GET
是一个属性,不应更新所请求的资源。如果客户端预取和/或缓存该假定安全的请求的结果,则您的视图计数不正确
要问自己的另一个问题是,视图计数是否与该资源的GET
请求同义。换句话说,您的应用程序可能会出于用户视图以外的原因对资源执行GET
。如果是这样,这将是在单独的非安全请求中增加视图计数的另一个原因
如果视图计数确实是元数据,并且
GET
确实等同于用户视图,那么我将继续增加GET
上的计数器。一个单独的请求是有代价的,并且对于每个安全请求,服务器上可能会发生其他无害的副作用(例如日志记录)。控制器处理Web内容,服务实现业务逻辑,数据库(dao)访问数据库。感谢您的回答。也许我的问题不清楚,但我的问题是关于使用RESTAPI更新计数器的最佳实践,而不是关于多层体系结构。我试图问以下问题-我应该通过提到的GET
请求更新计数器,还是应该引入另一个API。。比如说POST/products/{productID}/viewings
,然后在GET
之后调用它来更新计数器?
@RequestMapping(value = "/product/{id}", method = { RequestMethod.GET, RequestMethod.POST })
public Product getProduct(@PathVariable String id){
//get and update product
return product;
}