我正在开发一个spring应用程序,其中我有三层作为大多数其他spring应用程序。前面的Rest控制器,中间的Services和后面的JPA存储库。现在我们将spring实体映射到db,在我的例子中它们是普通的旧java对象(POJO),只有一些字段和getter以及setter,我通常更喜欢并且不想在其中放置任何业务逻辑。但是,在这个项目中,我发现在很多服务中,我重复相同的代码,类似的东西
User user=userRepository.findUserByName("some name here");
if(user==null){
throw new UserNotFoundException("User not found");
}
现在,这不仅适用于单个实体,还有许多其他类似的重复部分。所以,我已经开始担心它并寻找可能的区域来推动代码并消除重复的部分。有一点像在域驱动设计中所说的那样,将业务逻辑放在实体中,现在它们将同时具有数据和业务逻辑的一部分。这是一种常见做法吗?
答案 0 :(得分:1)
几乎看起来像一个简单的代码重用问题。如果你总是在所有上下文中抛出相同的异常那么如果在用户不存在的情况下在存储库中实现findExistingUserByName
方法呢?
您的代码将变为:
User user = userRepository.findExistingUserByName("username");
如果您不想更改存储库合同,您还可以在应用程序级别实现UserFinderService
,该UserRepository
包裹withExistingAggregate<User>(userRepository.findUserByName("username"), (User user) -> ...)
并提供该服务级别行为。
另一个更通用的想法可能是实现泛型方法,并通过继承,组合或静态类使它可用于您的应用程序服务,这将允许您执行以下操作:
__del__
答案 1 :(得分:0)
您可以在此类似案例中从存储库返回Optional<User>
。
那么您的服务代码将如下所示:
userRepository.findUserByName("some name here")
.ifPresent(user -> doThmsWithUser(user));