Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot 2.3不明确映射_Java_Spring_Spring Boot - Fatal编程技术网

Java Spring Boot 2.3不明确映射

Java Spring Boot 2.3不明确映射,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个spring控制器,它有两个端点,当它们被访问时返回一个任意方法异常。我试图使用HeaderContentNegotiationStrategy来区分它们,它查看传入请求的Accept头,以确定将请求映射到哪个方法。据我所知,这个策略应该将传入的accept头与products表示法进行比较。在我的例子中,这两种方法都会生成application/json媒体类型,但是Spring还允许您提供一个consumes,我读到它时,还应该让内容协商查看请求的content-type头以映射该方

我有一个spring控制器,它有两个端点,当它们被访问时返回一个任意方法异常。我试图使用HeaderContentNegotiationStrategy来区分它们,它查看传入请求的Accept头,以确定将请求映射到哪个方法。据我所知,这个策略应该将传入的accept头与products表示法进行比较。在我的例子中,这两种方法都会生成application/json媒体类型,但是Spring还允许您提供一个consumes,我读到它时,还应该让内容协商查看请求的content-type头以映射该方法

我的问题是,在进行映射时,如何让内容协商也查看内容类型头?如果您无法让内容谈判者查看consumes符号,为什么会出现它?有什么意义

控制器:

@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)}"