Spring Rest端点和服务层分离

伊姆兰

在spring boot应用程序中,我有两个服务:GroupService和UserService。还有各自的模型类Group和User以及存储库。我将公开两个Rest端点,一个用于用户,一个用于组。现在,我有了一个端点,该端点将给定用户添加到给定组中,如下所示,现在忘记了可能的空检查和其他问题。

@PostMapping(path="groups/{group-id}/add/{user-id}")
public ResponseEntity<Group> setUserGroup(@PathVariable(value="group-id")Long groupId, @PathVariable(value="user-id")Long userId)
    {   Group group=groupService.findById(groupId);
        group.addUser(userService.findById(userId));
        return new ResponseEntity<Group>(groupService.save(group),HttpStatus.OK);
    }

现在的问题是,处理这种情况的最佳实践是什么。通过在组服务中注入用户服务而不是在其余端点中处理逻辑来处理组服务中的逻辑不是很好吗?在那种情况下,组服务将依赖于用户服务,但是如果(让我们想像这样的情况)多个其余端点需要,则至少可以重用该逻辑。

当前的实现具有优势,因为服务不会变得彼此依赖。但是,如果我们具有复杂的逻辑,并且可以说我们具有复杂的事务,那么肯定没有合适的休息端点来处理它。请帮助我了解我应该使用哪种方法以及什么是行业最佳实践。

尤里·布拉切克(Yurii Bratchuk)

看来我们这里有典型的3层架构!

  • 端点的适当位置是Controller。
  • 将用户添加到组之类的业务逻辑应位于服务层中。您可以自由创建服务并在彼此之间注入服务,但要避免循环依赖。此外,还应将DAO注入服务中。
  • 事务管理应在服务层上实现。(请参阅Spring的@Transactional注释)
  • 如果您的类“ GroupService”和“ UserServise”包含用于直接存储操作的方法(例如,创建/读取/更新/删除/由...查找)等,则它们在逻辑上不应属于服务层。这些类属于持久层,应命名为GroupRepository或GroupDao(DAO-数据访问对象)。

  • 仓库可以手动实现,但是流行的方法是使用Spring Data接口。我强烈建议您检查http://projects.spring.io/spring-data/#quick-start

在您的情况下,我看到以下图片:

@Component
GroupRepository {
   // Manually implemented DAO, but more simple way is Spring Data
   ...
}

@Component
UserRepository {
   // Manually implemented DAO
   ...
}

@Service
ManagementService {
  @Autowire
  private UserRepositoty userRepository;

  @Autowire
  private GroupRepository groupRepository;

  @Transactional
  public Group addUserToGroup (Long groupId, Long userId) {
         Group group=groupRepository.findById(groupId); group.addUser(userRepository.findById(userId));
          return groupRepository.save(group);
    }
}

@Controller
ManagementController {

      @Autowire
      private ManagementService managementService;

      @PostMapping(...)  
      public ResponseEntity<Group> setUserGroup(@PathVariable Long groupId, @PathVariable Long userId) { 

          return new ResponseEntity<Group>(managementService.addUserToGroup(groupId, userId),HttpStatus.OK);
      }
}

参见https://www.petrikainulainen.net/software-development/design/understanding-spring-web-application-architecture-the-classic-way/

PS一句话涉及ResponseEntity的用法:在大多数情况下,以下简化代码不是必需的。魔术是RestController注释的背后。https://spring.io/guides/gs/rest-service/

@RestController
ManagementController {

      @Autowire
      private ManagementService managementService;

      @PostMapping(...)  
      public Group setUserGroup(@PathVariable Long groupId, @PathVariable Long userId) { 

          return managementService.addUserToGroup(groupId, userId);
      }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章