問題的出現是這樣的,我從前端介面提交資料資訊,然後在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給刪掉,我丟,給網上答案繞暈了(不怪網上怪自己),想想這麼簡單的問題(做出來才簡單)搞了這麼久,浪費這麼長時間,還浪費這麼長時間記錄這麼簡單的問題,沒毛病。
下次碰到問題,第一個想著自己先解試一下,不要一味的依賴網上的解答,有時候也可能事倍功半,就像我浪費的時間!