Java Spring Boot 2.3不明确映射
我有一个spring控制器,它有两个端点,当它们被访问时返回一个任意方法异常。我试图使用HeaderContentNegotiationStrategy来区分它们,它查看传入请求的Accept头,以确定将请求映射到哪个方法。据我所知,这个策略应该将传入的accept头与products表示法进行比较。在我的例子中,这两种方法都会生成application/json媒体类型,但是Spring还允许您提供一个consumes,我读到它时,还应该让内容协商查看请求的content-type头以映射该方法 我的问题是,在进行映射时,如何让内容协商也查看内容类型头?如果您无法让内容谈判者查看consumes符号,为什么会出现它?有什么意义 控制器:Java Spring Boot 2.3不明确映射,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个spring控制器,它有两个端点,当它们被访问时返回一个任意方法异常。我试图使用HeaderContentNegotiationStrategy来区分它们,它查看传入请求的Accept头,以确定将请求映射到哪个方法。据我所知,这个策略应该将传入的accept头与products表示法进行比较。在我的例子中,这两种方法都会生成application/json媒体类型,但是Spring还允许您提供一个consumes,我读到它时,还应该让内容协商查看请求的content-type头以映射该方
@ResourcePayloadOverride(action = ActionTypes.READ)
@CustomPermission(Permission.READ)
@RequestMapping(method = RequestMethod.POST,
produces = { MediaType.APPLICATION_JSON_VALUE, ResourceCollection.MEDIA_TYPE_JSON_VALUE },
consumes = MediaType.TEXT_PLAIN_VALUE)
public ResponseEntity<ResourceCollection<Class1>> method1(
@PathVariable(value="param_1") String param1,
@RequestParam(value="param_2", required=false) long param2,
@RequestParam(value="param_3", required=false) int param3,
@RequestParam(value="param_4", required=false) String param4,
@RequestBody(required=false) String body) {
[...]
}
@RequestMapping(method = { RequestMethod.POST },
produces = { MediaType.APPLICATION_JSON_VALUE, Class1.MEDIA_TYPE_JSON_VALUE },
consumes = { Class1.MEDIA_TYPE_JSON_VALUE, Class2.MEDIA_TYPE_JSON_VALUE, MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<Class1> post(
@PathVariable("param1") String param1,
@RequestParam(value="param2", required = false) String param2,
@RequestParam(value="param3", required = false) String param3,
@RequestParam(value="param4", required = false) String param4,
@RequestBody(required=false) String noop) //Actually needed!!!
{
[...]
}
我在这里用虚拟值替换了许多细节,但我不认为这会影响更大的问题简化问题:根据
消耗量区分端点
导入org.springframework.web.bind.annotation.RequestParam;
@RestController
类控制器{
@PostMapping(value=“/post”,consumes=MediaType.APPLICATION\u JSON\u value)
公共字符串postJson(@RequestBody(required=false)字符串数据){
返回“json:”+数据;
}
@PostMapping(value=“/post”,consumes=MediaType.TEXT\u PLAIN\u value)
公共字符串postText(@RequestBody(required=false)字符串数据){
返回“文本:”+数据;
}
}
这将在实际提供数据时实现预期目标:
curl-d“{'x':'y'}”-H”内容类型:application/json”-x POSThttp://localhost:8080/post
json:{'x':'y'}
curl-d“hello”-H“内容类型:text/plain”-X POSThttp://localhost:8080/post
文本:你好
但在不发送数据的情况下,这将不起作用:
curl-H“内容类型:application/json”-X POSThttp://localhost:8080/post
{…错误:为“/post”映射的处理程序方法不明确}
当没有任何内容可使用时,无法区分请求
可能的解决方法:
- 使数据成为必需的
,并处理空数据@RequestBody(required=true)字符串数据
- 通过使用额外的
使端点唯一,如标题
@PostMapping(value=“/post”,consumes=MediaType.TEXT\u PLAIN\u value,headers=“allow=TEXT”)
curl-H“内容类型:文本/普通”-H“允许:文本”-X帖子http://localhost:8080/post
文本:空
您有不同的请求参数是什么阻止您使用不同的URL?它们几乎都不是必需的,而且这是一个已经存在的api,因此我无法对其进行有意义的更改。我真正需要做的是让产品和消费像Spring声称的那样工作
{"version":1,"timeStamp":"2021-05-13T16:30:33.785Z","level":"error","source":"","message":"java.lang.IllegalStateException: Ambiguous handler methods mapped for '/{my_endpoint}': {public org.springframework.http.ResponseEntity {myPackage.class}.method1(java.lang.String,long,int,java.lang.String,java.lang.String), public org.springframework.http.ResponseEntity {myPackage.class}.post(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)}","messageParameters":{"0":"java.lang.IllegalStateException","1":"Ambiguous handler methods mapped for '/{my_endpoint}': {public org.springframework.http.ResponseEntity {myPackage.class}.method1(java.lang.String,long,int,java.lang.String,java.lang.String), public org.springframework.http.ResponseEntity {myPackage.class).post(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)}"