gpt4 book ai didi

Spring REST端点和服务层分离

转载 作者:行者123 更新时间:2023-12-01 11:16:42 24 4
gpt4 key购买 nike

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

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

当前实现具有优势,因为服务不会相互依赖。但是,如果我们有复杂的逻辑,并且假设我们有复杂的事务,那么休息端点肯定不是处理它的正确位置。请帮助我了解我应该使用哪种方法,以及行业最佳实践是什么。

最佳答案

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

  • 端点的适当位置是 Controller 。
  • 将用户添加到组等业务逻辑应位于服务层。
    您可以自由地创建服务并将一个服务注入(inject)另一个服务,但要避免循环依赖。 DAO 也应该被注入(inject)到服务中。
  • 事务管理应该在服务层实现。 (参见 Spring 的 @Transactional 注释)
  • 如果你的类“GroupService”和“UserServise”包含直接存储操作的方法(例如创建/读取/更新/删除/查找/等),它们在逻辑上不应该属于服务层。这些类属于持久层,应该命名为 GroupRepository 或 GroupDao(DAO - 数据访问对象)。
  • 存储库可以手动实现,但流行的方式是使用 Spring Data 接口(interface)。我强烈建议检查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/

    附言关于 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);
    }
    }

    关于Spring REST端点和服务层分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49927307/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com