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 可以使用它来将传入请求路由到正确的请求处理方法。
正如标题所说,如果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 可以使用它来将传入请求路由到正确的请求处理方法。