我有两个单独的@Service
带注释的类,我需要在@GetMapping
带注释的类中的单个@RestController
注释方法中调用它。
这是一种不好的做法吗?
类似以下示例:
UserService.java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User findById(Long id) throws UserNotFoundException {
User user = userRepository.findOne(id);
if (user != null) return user;
throw new UserNotFoundException("The ID " + id + " doesn't behave to any user!");
}
}
PostService.java
@Service
public class PostService {
@Autowired
PostRepository postRepository;
public List <Post> findPostsByUserId(Long userId) {
return postRepository.findByUserId(userId);
}
}
UserController.java
@RestController
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PostService postService;
@GetMapping("/users/{id}/posts")
public ResponseEntity <List <Post>> retrieveAllPostsByUserId(@PathVariable("id") Long userId)
throws UserNotFoundException {
User user = userService.findById(userId);
if (user != null) {
List <Post> posts = postService.findPostsByUserId(userId);
return new ResponseEntity <List<Post>>(posts, HttpStatus.OK);
}
throw new UserNotFoundException("The ID " + userId + " doesn't behave to any user!");
}
}
答案 0 :(得分:1)
总的来说,这应该没问题,实际上是一种很好的做法。 如果更新到两个存储库(不是在这种情况下),只需要知道事务边界。
但在这种特殊情况下,您的代码会不必要地复杂化。
例如,UserService.findById不返回null并抛出异常。 但是在你的控制器代码中你检查null,当它不为null时你会抛出异常。这是多余的。
在您的特定情况下,只需调用postService.findPostsByUserId即可。为非现有用户返回空列表应该没问题。 访问/ users / 123后,客户端很可能正在访问/ users / 123 / posts,因此可能不需要额外检查用户是否存在。