我正在开发一个Spring应用程序,与其他大多数Spring应用程序一样,该应用程序具有三层。其余控制器位于前面,中间位于服务中,而JPA存储库位于后面。现在我们有映射到db的spring实体,在我的情况下,它们是普通的旧Java对象(POJO),只有一些字段,getter和setter,我通常更喜欢它们,并且不想在其中放置任何业务逻辑。但是,在这个项目中,我发现在很多服务中,我都在重复相同的代码,诸如此类
User user=userRepository.findUserByName("some name here");
if(user==null){
throw new UserNotFoundException("User not found");
}
现在,这不仅是针对单个实体,还有许多其他类似的重复部分。因此,我开始担心它,并寻找可能的区域来推送该代码并消除重复的部分。如域驱动设计中所述,一件事使感觉变得很敏感,将业务逻辑放入实体中,现在它们将同时具有数据和业务逻辑的一部分。这是常见的做法吗?
最佳答案
看起来很像一个简单的代码重用问题。如果在所有情况下总是抛出相同的异常,那么在用户不存在时抛出的存储库中实现findExistingUserByName
方法又该怎么办?
您的代码将变为:
User user = userRepository.findExistingUserByName("username");
如果您不想更改存储库合同,则还可以在应用程序级别实现
UserFinderService
,该应用程序会包装UserRepository
并提供该服务级别的行为。另一个更通用的想法可能是实现通用方法,并通过继承,组合或静态类将其提供给您的应用程序服务,这将使您可以执行以下操作:
withExistingAggregate<User>(userRepository.findUserByName("username"), (User user) -> ...)
关于java - Spring实体和业务逻辑?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45196777/