方法返回null时的句柄

时间:2018-06-17 14:55:11

标签: java spring-boot spring-data-jpa

我开始使用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;

1 个答案:

答案 0 :(得分:1)

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

@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结果传递给Optional.empty,因此您可以保留现在的构造:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  Optional.ofNullable(userRepository.findOneByUsername(username))
      .orElseThrow(() -> new UsernameNotFoundException("User not found"));
}
  • 显式检查null,如果发生则抛出新的UsernameNotFoundException(“User not found”)

  • 让nullpointerexception发生。在某些情况下,这是可行的,但由于您显然希望在找不到用户时抛出UsernameNotFoundException,因此在此处不起作用。

  • 如果找不到结果,则更改底层代码以引发异常。这可能是我的选择,因为空值通常会让人感到麻烦。一些流行的框架,例如Spring JDBCSpring Data就是这样做的。由于您已经在使用Spring,我强烈建议您使用相同的模式。

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