【发布时间】:2020-05-05 12:34:25
【问题描述】:
所以我做了简单的操作,在我的存储库中找到一个条目。如果条目不存在,则抛出异常。
@NotNull
public static User getUserFromUuid(UUID userUuid) {
Optional<User> userOptional = userRepository.findByUserIdentifier(userUuid);
if (!userOptional.isPresent()) {
if (logger.isInfoEnabled()) logger.info(String.format("Unable to find user with uuid %s", userUuid.toString()));
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "User Not Found");
}
return userOptional.get();
}
@NotNull
public static Group getGroupFromId(Long groupId) {
Optional<Group> groupOptional = groupRepository.findById(groupId);
if (!groupOptional.isPresent()) {
if (logger.isInfoEnabled()) logger.info(String.format("Group with id %s does not exist", groupId));
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group Not Found");
}
return groupOptional.get();
}
我意识到我最终会为我所有的 find 方法做很多次。他们中的大多数人将做一项非常相似的任务。
一种方法是用我的版本扩展CrudRepository,但我想通过 finds 为 al 实现这种模式。
另一种方法是传递类、方法、参数和错误消息以进行搜索。 Lambda 方法似乎是一种方法,但我无法理解如何将其应用于我的问题。
This 接近解决问题,但返回类型正在改变。我也会传递可变数量的参数。
我可以采取什么方法来做到这一点?
编辑:
我也想处理这个案子
Optional<GroupUser> groupUser = groupUserRepository.findByUserAndGroup(user, group
我最终可能会拥有多个查找参数。
python 中类似的东西是
def perform( fun, *args ):
fun( *args )
def action1( args ):
something
def action2( args ):
something
perform( action1 )
perform( action2, p )
perform( action3, p, r )
【问题讨论】:
-
您好,您是否会考虑使用 Spring AOP 方面,以便使用正确的切入点来包装您的存储库的方法返回 Optional?
-
@ThomasEscolan 我实际上不知道它是如何工作的。但我可以研究一下,看看它如何适用于此。任何帮助将不胜感激!
-
这是一个关于使用 Spring baeldung.com/spring-aop 的面向方面编程的良好开端,您可以通过拦截 Spring bean 中的公共方法调用来编织一些行为