SpringMVC 資料繫結時,表單輸入值與實體資料型別一一對應的問題
阿新 • • 發佈:2019-01-24
SpringMVC 資料繫結的一個小小的錯誤,竟浪費了不少時間,趕緊記下來,免得重蹈覆轍。
Model
public class Student{ private String name; private Long id; private Integer age; // getter & setter ... }
Controller
@Controller public class StudentController { @RequestMapping(value = "/student", method = RequestMethod.GET) public ModelAndView student() { return new ModelAndView("student", "command", new Student()); } @RequestMapping(value = "/addStudent", method = RequestMethod.POST) public String addStudent(@ModelAttribute Student student, ModelMap model) { model.addAttribute("name", student.getName()); model.addAttribute("age", student.getAge()); model.addAttribute("id", student.getId()); return "result"; } }
Form
<form:form method="post" action="addStudent"> <table> <tr> <td><label >名字:</label></td> <td><form:input path="name" /></td> </tr> <tr> <td><label >年齡:</label> <td><form:input path="age" /></td> </tr> <tr> <td><label >編號:</label></td> <td><form:input path="id" /></td> </tr> <tr> <td colspan="2"> <input type="submit" value="提交表單"/> </td> </tr> </table> </form:form>
填表單時,那個編號的內容無法轉換成實體類的id,此時提交會報400錯誤。如果把實體類的id型別改成String,輸入內容能轉換成String,則可正常提交;按上面所給的id型別Long,則這個欄位值只能填數值,所填數值能轉換成Long型別就不會報400錯誤。
由於表單資料提交時都是按字串形式提交的,後臺則按資料繫結的物件型別,把字串值轉換成相應的物件型別值接收,如果字串值轉換出錯,則引發400錯誤。所以,在填表單時所填的值,要能正確轉換成實體對應的型別值,它們之間要一一對應才能正常提交。
這種問題通用的解決辦法是對錶單資料要做有效性檢查,加上validation。