Spring @RestController:我是否需要在方法中明确指示 produces = MediaType.APPLICATION_JSON_VALUE

Spring @RestController: should I need to indicate produces = MediaType.APPLICATION_JSON_VALUE in a method explicitely

正如标题所说,如果controller已经注解了@RestController,是否还需要在controller的方法中声明produces = MediaType.APPLICATION_JSON_VALUE?我正在处理一个旧的遗留应用程序,其中所有控制器方法都已声明。 Spring Boot Initializr 在没有它的情况下生成默认的 REST 控制器,即使我省略 MediaType.APPLICATION_JSON_VALUE,它仍然可以正常工作。 我记得在某个地方看到过应该是默认的。正确与否?

@RestController
@RequestMapping("/posts")
@Slf4j
public class PostsController {

    @PutMapping(value = "posts/{post_d}", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Post> getPost(@PathVariable Long postId) {
      ...
    }
}

我认为你应该告诉我们发生的错误。通常,不需要在控制器级别指定 produces 的值,而是在使用它的服务级别指定。

注意测试该功能的路径为:

baseURL/posts/posts/{post_d}

acknowledge/remember 的第一件事是 @RequestMapping 注释(或专门的 @GetMapping@PostMapping 等)中的所有内容都是用于映射。因此,那个东西被命名为 @RequestMapping。它不会在写入响应时强制执行任何操作。事实上 produces 属性实际上采用 String[] 以便您可以限制此方法匹配的响应类型(Accept-Header)。因此,如果您执行 produces = MediaType.APPLICATION_JSON_VALUE 只有在响应中明确接受 application/json 的请求才会转到此方法。

它用于 mapping/routing 的事实使得对同一个 URL 使用多种方法但产生不同结果很有用。假设您有一个生成报告的请求方法,该报告可以 XML 或 PDF 格式创建。但是 PDF 比较复杂,所以你需要一个不同的方法。

@RequestMapping(value="/report", produces = "application/xml")
public ReportXml generateXmlReport() {}

@RequestMapping(value="/report", produces = "application/pdf")
public void generateXmlReport(HttpServletResponse response) {
  // use iText to generate a PDF and directly write to the response
}

现在由于 produces Spring MVC 可以使用它来将传入请求路由到正确的请求处理方法。