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;
    }