正如标题所说,我有一些存储库,如:
public UserRepository{
public Optional<User> findByUsername(String username){..logic..}
}
和服务:
public UserService {
@Autowired
private UserRepository userRepository;
public Optional<User> findByUsername(String username){ ..calling repository.. }
}
在我的@Controller类中,我想从UserService获取User实例
但是我不知道应该从@Service返回什么 - 可选并检查它是否在控制器内是否为Pre(或)只是为空?我很困惑..
我正试图将这么多逻辑移到@Service层,所以检查可选可能看起来不太好。
谢谢!
答案 0 :(得分:2)
理想情况下,您应该做的是抛出异常。这是最好的做法。但是,如果你愿意,你也可以坚持使用null,但是一个例外可以清楚地说明问题是什么,并且在后期阶段是非常可维护和可再分配的。
你可能喜欢这样做findByUsername(String username){
// find user
if(user !=null){
return User
}
else
throw new UserNotFoundException();
}
请点击此链接了解如何创建自定义例外。 http://techekiras.blogspot.in/2015/02/how-to-create-custom-exception-in-java.html
这就是如何处理这些问题 http://www.ekiras.com/2015/02/how-to-create-nested-custom-exceptions-in-java.html
在控制器上捕获这些异常以采取进一步措施。
答案 1 :(得分:0)
在Java 8中有一种新的可能性。使服务返回Optional。这是一种在签名中明确表示它可以返回null的好方法。您将被迫检查它是否为空但对avoid the famous NullPointerException
非常有帮助import java.util.Optional;
[...]
public Optional<User> getUser(String userName){
User user = userDAO.getByUsername(username);
return Optional.of(user);
}