为什么具有相同 URL 但生成不同 MediaTypes 的 RequestMappings 有效?

Why RequestMappings with the same URL but producing different MediaTypes works?

我想了解如果我有相同的 2 个请求映射 URL、参数(无参数)并生成类型(JSON),为什么 Spring 应用程序启动。默认方法正在生成 JSON(我测试了 XML 和其他人,但出现 500 错误,我没有依赖项)。我想知道这是 Intellij 还是 Spring 问题,或者是开始和被覆盖是正常的 Get 因为如果我也把 produces = MediaType.APPLICATION_JSON_VALUE 放在第二个上,我得到 error.Here 是有效的例子:

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<ExampleDTO>> getMethodd1() {
    return ResponseEntity.ok(ExampleStore.available);
}
@GetMapping()
public ResponseEntity<List<ExampleDTO>> getMethodd2() {
    return ResponseEntity.ok(ExampleStore.available);
}

此示例不再启动:

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<ExampleDTO>> getMethodd1() {
    return ResponseEntity.ok(ExampleStore.available);
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<ExampleDTO>> getMethodd2() {        
    return ResponseEntity.ok(ExampleStore.available);
}

PS:我知道请求应该因参数或 url 而异。

想得再远一点,我觉得还是很明显的。看到这三个controller的方法一样url:

@GetMapping(path = "/sameurl")
public String text() throws JsonProcessingException {
    return "some data\n";
}

@GetMapping(path = "/sameurl", produces = MediaType.APPLICATION_XML_VALUE)
public String xml() throws JsonProcessingException {
    return "<data>some data</data>\n";
}

@GetMapping(path = "/sameurl", produces = MediaType.APPLICATION_JSON_VALUE)
public String json() throws JsonProcessingException {
    return "{\"data\": \"some data\"}\n"; 
}

正如您在问题中已经看到的那样,它们的区别在于每种方法产生的结果。

实际调用的方法由客户端接受的内容选择,这使您可以在控制器级别灵活地选择如何处理请求,而无需自己检查接受类型。

与上面APIurls对应调用结果:

curl -H "Accept:application/someformat" localhost:8080/sameurl

some data

curl -H "Accept:application/json" localhost:8080/sameurl

{"data": "some data"}

curl -H "Accept:application/xml" localhost:8080/sameurl

<data>some data</data>

真正的副本是具有相同 URL 和相同类型的请求映射。没有区分属性了,Spring 不知道使用哪种方法。