Spring Boot:如何正确获取可选实体并校验空值优化角色添加代码?
Spring Boot用户添加角色代码优化方案
原代码通过orElse(null)将Optional转为null再做空判断,既违背了Optional的设计初衷,也容易引发空指针异常,同时缺乏明确的异常处理逻辑。以下是几种更规范的实现方式:
推荐方案:链式调用Optional API
利用Optional的ifPresent组合方法,仅当用户和角色都存在时执行添加操作,同时对不存在的场景抛出明确异常:
public UserEntityDto addRoleToUser(String username, String rolename) { Optional<UserEntity> userOpt = userRep.findByLastName(username); Optional<RoleEntity> roleOpt = roleRep.findByName(rolename); // 仅当两者都存在时,执行角色添加操作 userOpt.ifPresent(user -> roleOpt.ifPresent(role -> user.getRoles().add(role))); // 用户不存在时抛出异常,也可根据业务需求返回空Dto UserEntity userEntity = userOpt.orElseThrow(() -> new RuntimeException("指定用户不存在")); return userEntityMapper.fromUserEntity(userEntity); }
函数式风格实现
通过flatMap和map链式处理,逻辑更紧凑简洁:
public UserEntityDto addRoleToUser(String username, String rolename) { return userRep.findByLastName(username) .flatMap(user -> roleRep.findByName(rolename) .map(role -> { user.getRoles().add(role); return user; })) .map(userEntityMapper::fromUserEntity) .orElseThrow(() -> new RuntimeException("用户或角色不存在")); }
兼容空判断习惯的实现(不推荐)
如果偏好传统空判断写法,可使用isPresent()避免引入null值:
public UserEntityDto addRoleToUser(String username, String rolename) { Optional<UserEntity> userOpt = userRep.findByLastName(username); Optional<RoleEntity> roleOpt = roleRep.findByName(rolename); if (userOpt.isPresent() && roleOpt.isPresent()) { UserEntity user = userOpt.get(); RoleEntity role = roleOpt.get(); user.getRoles().add(role); return userEntityMapper.fromUserEntity(user); } throw new RuntimeException("用户或角色不存在"); }
关键注意事项
- 确保
UserEntity中的roles字段已初始化(比如在构造函数中实例化为new ArrayList<>()),避免调用add方法时触发空指针异常 - 建议使用自定义业务异常(如
UserNotFoundException、RoleNotFoundException)替代通用RuntimeException,便于后续异常的精准捕获和处理 - 在方法上添加
@Transactional注解,确保角色添加操作能持久化到数据库
内容的提问来源于stack exchange,提问作者obela06
相关产品推荐
相关产品推荐

