当前位置: 首页 > 知识库问答 >
问题:

Spring Boot 2.3模糊映射

尉迟俊能
2023-03-14

我有一个带有两个endpoint的spring控制器,当访问它们时,它们会返回任意方法异常。我试图使用HeaderContentNegotiationStrategy来区分它们,它查看传入请求的Accept标头,以确定将请求映射到哪个方法。据我所知,这种策略应该将传入的accept头与products符号进行比较。在我的情况下,这两种方法都会生成一个应用程序/json媒体类型,但是Spring还允许您提供一个consumes,我读取它们的文档时,还应该让内容协商查看请求的内容类型头来映射该方法。

我的问题是,在进行映射时,如何让内容协商也查看内容类型头?如果您无法让内容谈判者查看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!!!
{
    [...]
}

错误:

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

我在这里用虚拟值替换了许多细节,但我不认为这会影响更大的问题

共有1个答案

颛孙天宇
2023-03-14

简化问题:根据消耗区分endpoint


import org.springframework.web.bind.annotation.RequestParam;

@RestController
class ConsumeController {
    @PostMapping(value = "/post", consumes = MediaType.APPLICATION_JSON_VALUE)
    public String postJson(@RequestBody(required = false) String data) {
        return "json: " + data;
    }

    @PostMapping(value = "/post", consumes = MediaType.TEXT_PLAIN_VALUE)
    public String postText(@RequestBody(required = false) String data) {
        return "text: " + data;
    }
}

这将在实际提供数据时达到预期效果:

curl -d "{'x':'y'}" -H "Content-Type:application/json" -X POST http://localhost:8080/post
json: {'x':'y'}

curl -d "hello" -H "Content-Type:text/plain" -X POST http://localhost:8080/post
text: hello

但如果不发送数据,这将不起作用:

curl -H "Content-Type:application/json" -X POST http://localhost:8080/post
{...error: Ambiguous handler methods mapped for '/post'}

当没有可消费的内容时,无法区分请求。。。

可能的解决方法:

  • 将数据设为所需的RequestBody(required=true)字符串数据,并处理空数据
  • 使用额外的头使endpoint唯一,如PostMapping(value=“/post”,consumes=MediaType.TEXT\u PLAIN\u value,headers=“allow=TEXT”)
curl -H "Content-Type:text/plain" -H "allow:text"  -X POST http://localhost:8080/post
text: null
 类似资料:
  • 我是修改Minecraft的初学者,希望修改最新版本的Minecraft锻造版(v1.17.1)。我知道如何为1.16.5设置gradle项目,并且在很大程度上可以为1.17.1设置gradle项目。问题是我不知道Forge 1.17.1的模糊映射是什么。我需要知道,以便为构建的第34行设置正确的映射。格拉德尔:

  • 注意: Internet Explorer和Safari不支持SVG滤镜! <defs> 和 <filter> 所有互联网的SVG滤镜定义在<defs>元素中。<defs>元素定义短并含有特殊元素(如滤镜)定义。 <filter>标签用来定义SVG滤镜。<filter>标签使用必需的id属性来定义向图形应用哪个滤镜? SVG <feGaussianBlur> 实例 1 <feGaussianBlu

  • 本文向大家介绍UnityShader使用速度映射图实现运动模糊,包括了UnityShader使用速度映射图实现运动模糊的使用技巧和注意事项,需要的朋友参考一下  本文实例为大家分享了UnityShader实现运动模糊的具体代码,供大家参考,具体内容如下 原理: 像素的当前帧的NDC坐标(x,y值由uv映射而来,z值由深度值映射而来)——(使用_CurrentViewProjectionInvers

  • 本文向大家介绍Mybatis模糊查询及自动映射实现详解,包括了Mybatis模糊查询及自动映射实现详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Mybatis模糊查询及自动映射实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Mybatis的模糊查询 1. 参数中直接加入%% 1 2 3 4 5 6 7 8 9 param

  • 问题内容: 早上好,我正在处理一个模棱两可的映射,我无法解码…我正在使用Spring mvc 4.0.6和hibernate 4.3.6在tomcat中发动战争时遇到此错误: 我不明白为什么我会收到此错误。AppController很直 ClientService.java 在我看来,这一切都是很直接的……对于这种应用程序,我还是一个新手。 问题答案: 这是您收到的错误消息: 找到模糊的映射。无法

  • [ ] 查询包含马的学生 // 查询姓名包含马的学生 const { field = '' } = ctx.query const fields = field.split(';').filter(f =&gt; f) Student.findAll({ attributes: fields.length === 0 ? '' : fields, where: { name: