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

bel*_*ros 3 spring-mvc

正如标题所说,我想知道如果produces = MediaType.APPLICATION_JSON_VALUE控制器已经用 注释,我是否还需要在控制器的方法中声明@RestController?我正在开发一个旧的遗留应用程序,其中所有控制器方法都声明了这一点。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) {
      ...
    }
}
Run Code Online (Sandbox Code Playgroud)

M. *_*num 5

首先要承认/记住的是@RequestMapping注释(或专门的@GetMapping@PostMapping等等)中的所有内容都是用于映射。因此,那个东西被命名为@RequestMapping。它不会对所写的响应施加任何强制。事实上,该produces属性实际上采用String[],以便您可以限制Accept-Header此方法将匹配的响应类型( )。因此,如果您produces = MediaType.APPLICATION_JSON_VALUE只在响应中明确接受的请求application/json才会转到此方法。

事实上,它用于映射/路由,因此对于同一 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
}

Run Code Online (Sandbox Code Playgroud)

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