Spring Boot:application/x-www-form-urlencoded;charset=UTF-8‘ not supported

2020-10-19 12:00:15

Spring -Boot:Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported]

問題的出現是這樣的,我從前端介面提交資料資訊,然後在controller層以物件的形式接收資料

前端介面:

    <form action="/user/saveuser" method="post">
        使用者ID:<input name="id" type="text"><br>
        使用者姓名:<input type="text" name="username"><br>
        使用者年齡:<input type="text" name="age"><br>
        賬戶金額:<input type="text" name="price"><br>
        <input type="submit" value="提交">
    </form>

controller層

    @RequestMapping(value = "saveuser",method=RequestMethod.POST)
    public String saveUser(@RequestBody User user){
        System.out.println("user"+user);
        userMapper.save(user);
        return "redirect:/user/findAll";
    }

mapper:

    @Override
    public void save(User user) {
         jdbcTemplate.update("insert into user values (?,?,?,?)",user.getId(),user.getUsername(),user.getAge(),user.getPrice());

    }

pojo:

@Data
public class User {
    @NotNull(message = "id不能為空")
    private int id;
    @NotEmpty(message = "姓名不能為空")
    @Length(min = 2,message = "字串長度不能小於二")
    private String username;
    private int age;
    @Min(value = 60,message = "價格必須大於60")
    private double price;
}

本以為這個小demo會毫無懸念的執行成功,結果報了上述錯誤,一臉懵逼,因為沒有碰見過,作為一個新手,毫不猶豫的就直接搜百度搜谷歌了,乍一看,總結一下原來說到底是編碼或者json的問題導致的,這個就簡單了。可是輕視敵人你就錯了,網上的解答很詳細,但是我的問題對他們全部免疫,我從懵逼到更加懵逼。

第一個解答是說傳json時,設定content-type,肯定跟Ajax相關,但是我又沒寫Ajax,只是普通的form表單,但我還是嘗試了一下,我用了@RequestBody,在我前端傳過來的資料會自動與實體類物件進行匹配,但是資料完全過不來,所以我改用了@RequestParam,然後直接用String型別進行接收列印到控制檯,看看到底是怎麼回事
更改後:

    @RequestMapping(value = "saveuser",method=RequestMethod.POST)
    public String saveUser(@RequestParam String user){
        System.out.println("user"+user);
//        userMapper.save(user);
        return "redirect:/user/findAll";

結果列印臺出現一段亂碼,且列印在控制檯上的並不是以{ }形式的,所以我確定了傳過來的資料不是json格式。那麼就是亂碼了。

開始查亂碼,然後就有了我在yml中寫了一堆編碼的東西

  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    encoding: UTF-8
    mode: HTML5
  http:
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  messages:
    encoding: UTF-8
server:
  port: 8080
  tomcat:
    uri-encoding: UTF-8

然後就是前端介面直接以記事本的形式開啟改編碼,但都無濟於事。
然後回去重新看了spring mvc,針對前端基於物件新增的相關屬性,到了controller層是直接進行匹配的,而我傳過來的也不是json格式,所以我直接就把@RequestBody給刪掉,我丟,給網上答案繞暈了(不怪網上怪自己),想想這麼簡單的問題(做出來才簡單)搞了這麼久,浪費這麼長時間,還浪費這麼長時間記錄這麼簡單的問題,沒毛病。
下次碰到問題,第一個想著自己先解試一下,不要一味的依賴網上的解答,有時候也可能事倍功半,就像我浪費的時間!