从Spring中的@Controller类中的单个方法调用两个不同的服务是否可以?

时间:2018-05-29 21:16:48

标签: java rest spring-boot

我有两个单独的@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!");
    }

}

1 个答案:

答案 0 :(得分:1)

总的来说,这应该没问题,实际上是一种很好的做法。 如果更新到两个存储库(不是在这种情况下),只需要知道事务边界。

但在这种特殊情况下,您的代码会不必要地复杂化。

例如,UserService.findById不返回null并抛出异常。 但是在你的控制器代码中你检查null,当它不为null时你会抛出异常。这是多余的。

在您的特定情况下,只需调用postService.findPostsByUserId即可。为非现有用户返回空列表应该没问题。 访问/ users / 123后,客户端很可能正在访问/ users / 123 / posts,因此可能不需要额外检查用户是否存在。