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给删掉,我丢,给网上答案绕晕了(不怪网上怪自己),想想这么简单的问题(做出来才简单)搞了这么久,浪费这么长时间,还浪费这么长时间记录这么简单的问题,没毛病。
下次碰到问题,第一个想着自己先解试一下,不要一味的依赖网上的解答,有时候也可能事倍功半,就像我浪费的时间!