方法返回 null 时的处理



我从使用Spring Boot和Java开始,我想知道如何处理方法返回null的情况。

@Entity
@Table(name = "users")
@Data
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id", nullable = false, updatable = false)
private Long id;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "enabled", nullable = false)
private boolean enabled;
......
}

@Service("userService")
public class UserService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return userRepository.findOneByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found"));
}
}

UserService我想知道如何处理方法findByUsername返回null的情况。我应该使用这样的东西。现在,当找不到用户时,它会引发异常。

UserDetails u = userRepository.findOneByUsername(username);
if(u === null) 
return...
else
return u;

我理解了这个问题,所以你有这个:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return userRepository.findOneByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
}

但 findOneByUsername(( 可以返回 null。在这种情况下,一些选项是

  • 使用Optional.ofNullable(userRepository.findOneByUsername(username))这将强制 null result 转换为 Optional.empty,以便您可以保留您现在拥有的构造:

 

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional.ofNullable(userRepository.findOneByUsername(username))
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
}
  • 显式检查空值,如果发生,则抛出新的用户名未发现异常("未找到用户"(

  • 让空指针异常发生。在某些情况下,这是可行的,但由于您显然希望在找不到用户时抛出用户名NotFoundException,因此它在这里不起作用。

  • 更改基础代码以在找不到结果时引发异常。这可能是我的选择,因为空值经常是麻烦的接收。一些流行的框架,如Spring JDBC和Spring Data就是这样做的。由于您已经在使用 Spring,因此我强烈建议您遵循相同的模式。

TLDR;你能不能改变底层代码,如果找不到对象,就会抛出异常?

最新更新