如何为嵌套资源制作单独的 REST 控制器?弹簧靴

Ale*_*kov 3 rest spring-boot

我有一个 REST 控制器。它处理资源“消息”。每条消息内部都可以包含评论。

/api/v1/messages/1
/api/v1/messages/2

/api/v1/messages/1/comments/1
/api/v1/messages/1/comments/2
Run Code Online (Sandbox Code Playgroud)

这是一个代码:

@RestController
@RequestMapping("/api/v1/messages/")
public class RestControllerV1 {

    @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<Message> getMessage(@PathVariable("id") Long messageId) {

    }

    @RequestMapping(value = "{messageId}/comments/{commentId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<Comment> getComment(@PathVariable("messageId") Long messageId, @PathVariable("commentId") Long commentId) {

    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常。但是我认为两个资源一个大的控制器不是很好。所以我想要不同的控制器(SOLID,S-principle)。

MessageControllerV1
Run Code Online (Sandbox Code Playgroud)

CommentControllerV1
Run Code Online (Sandbox Code Playgroud)

是否可以在 Spring Boot 应用程序中划分控制器?

cas*_*lin 5

你可以有类似的东西:

@RestController
@RequestMapping("/api/v1/messages")
public class MessageController {

    @RequestMapping(value = "{messageId}", 
                    method = RequestMethod.GET, 
                    produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<Message> getMessage(@PathVariable("messageId") Long messageId) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)
@RestController
@RequestMapping("/api/v1/messages/{messageId}/comments")
public class CommentController {

    @RequestMapping(value = "{commentId}", 
                    method = RequestMethod.GET, 
                    produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<Comment> getComment(@PathVariable("messageId") Long messageId, 
                                              @PathVariable("commentId") Long commentId) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)