我开始使用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;
答案 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 JDBC和Spring Data就是这样做的。由于您已经在使用Spring,我强烈建议您使用相同的模式。
TLDR;你能改变底层代码,如果找不到对象就抛出异常吗?