【问题标题】:Spring can't map MultiValueMap to beanSpring无法将MultiValueMap映射到bean
【发布时间】:2017-07-17 19:53:04
【问题描述】:

将 x-www-form-urlencode 数据发布到 Spring。 这有效:

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void sumbitFUD(@RequestBody final MultiValueMap<String, String> formVars) {
}

另一方面,这给出了一个例外:

内容类型 'application/x-www-form-urlencoded;charset=UTF-8' 不是 支持

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void sumbitFUD(@RequestBody Fud fud) {
}

这会导致 bean 上的所有字段都为空:

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public void sumbitFUD(Fud fud) {
   //not using @RequestBody 
}

FUD:

public class Fud {

    public String token_id;
    public String team_doamin;
    public String channel_id;
    public String user_id;
    public String user_name;
    public String command;
    public String text;
    public String response;
}

表单数据:

token%abc=&team_id%3DT0001=&team_domain%3Dexample=&channel_id%3DC2147483705=&channel_name%3Dtest=&user_id%3DU2147483697=&user_name%3DSteve=&command%3D%2Fweather=&text%3D94070=&response_url%3Dhttps=%2F%2Fhooks.slack.com%2Fcommands%2F1234%2F5678

POM:

<dependencies>
        <dependency>
            <groupId>net.gpedro.integrations.slack</groupId>
            <artifactId>slack-webhook</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!-- Spring Frameworks for Web, MVC and Mongo -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- JUnit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

【问题讨论】:

  • 我添加了答案,您可以查看一下吗?

标签: java spring spring-mvc spring-boot


【解决方案1】:

我发现这里有两个问题。

  1. @RequestBody 注释的使用。它,或者更准确地说是它的处理程序——HttpMessageConverter 的一个子类,不能处理这些情况。您应该改为处理@ModelAttribute

  2. 缺少二传手。 Spring 无法将传入的值设置到没有设置器的目标实例。我不知道是否有可以直接使用字段操作的属性,但我建议避免这样做。将字段设为private

【讨论】:

  • 试过了,没用。将 Fud 上的字段设为私有并添加 getter 和 setter,将控制器签名更改为 @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public void sumbitFUD(@ModelAttribute Fud request) Fud 上的字段仍然为空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2011-03-17
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多