我目前正在使用Spring Boot来实现公告板API。我将向您展示的源代码场景是关于公告板或注释的修改,
修改之前,都必须在输入评论或公告板时都提交密码。
因此,我只使用'isBoard'作为input:hidden值来执行'boardRepository'中的'findById',并将其与passwordEncoder的匹配功能进行比较,然后更新布尔值。
但是,以下代码显示重复并使用了相同的逻辑。有没有办法使它更简单?
@Transactional
public boolean tryToUpdateArticleOrReply(Long id, String password, boolean isBoard) throws ApiException {
AtomicBoolean result = new AtomicBoolean(false);
if(isBoard) {
boardRepository.findById(id).ifPresent(
board -> {
result.compareAndSet(passwordEncoder.matches(board.getUserPass(), password), true);
}
);
} else {
replyRepository.findById(id).ifPresent(
reply -> {
result.compareAndSet(passwordEncoder.matches(reply.getUserPass(), password), true);
}
);
}
if(result.get())
return result.get();
throw new ApiException("INVALID_USER_PASS", "you submitted invaild password.", new ApiExceptionData().add("user_pass", password));
}
如果您的findById
和getUserPass
方法来自接口(并且findById
方法返回来自接口的接口getUserPass
),那么您可以简单地执行以下操作:
private boolean check(FindByIdInterface repository,
Long id,
String password) {
return repository.findById(id)
.map(result ->
passwordEncoder.matches(
result.getUserPass(), password))
.orElse(false);
}
然后只需调用它,repository
即可根据isBoard
变量选择要传递的位置。isBoard ? boardRepository : replyRepository
如果它们不是来自共享接口,则可以使用Java中的某些功能接口来有效地“假装”它们。
/* R = repository type, T = return type of 'findById' */
private <R, T> check(Function<R, Optional<T>> getByIdMapper,
Function<T, String> getUserPassMapper,
R repository,
Long id,
String password) {
return getByIdMapper.apply(repository)
.map(result ->
passwordEncoder.matches(
getUserPassMapper.apply(result),
password))
.orElse(false);
}
然后用类似这样的名称:
if (isBoard) {
return check(BoardRepository::getById,
Board::getUserPass,
boardRepository, id, password);
} else {
// ...
}
请注意,在任何情况下都没有AtomicBoolean
必要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句