1

如果我有相同的 2 个 requestMapping URL、参数(无参数)并生成类型(JSON),我想了解为什么 Spring 应用程序会启动。默认情况下,这些方法正在生成 JSON(我测试了 XML 和其他,我得到 500 错误,我不'没有依赖项)。我想知道它是 Intellij 还是 Spring 问题,或者是否正常启动并获得第二个覆盖,Get因为如果我也放produces = MediaType.APPLICATION_JSON_VALUE第二个,我得到错误。这是有效的示例:

@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:我知道请求应该因参数或网址而异。

4

1 回答 1

1

如果你想得更远一点,我认为这是很明显的。请参阅具有相同 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"; 
}

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

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

使用上述 API url 和相应的调用结果:

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

一些数据

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

{“数据”:“一些数据”}

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

<data>一些数据</data>

那么实际的副本是具有相同 URL 和相同类型的请求映射来生成。不再有区分属性,Spring 无法判断使用哪种方法。

于 2021-06-19T10:27:22.203 回答