【发布时间】:2021-03-19 00:46:58
【问题描述】:
我有以下代码允许用户更新姓名和年份。
型号
@Entity
public class Person implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private int year;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
}
控制器
@RequestMapping(value = "/person", method = RequestMethod.POST)
public ModelAndView editPerson(@ModelAttribute Person person)
{
//perform operations
//display results
ModelAndView modelAndView = new ModelAndView("Person.html");
modelAndView.addObject("personBind", person);
return modelAndView;
}
查看
<form action="person" method="post" th:object="${personBind}">
Name:
<input type="text" th:field="*{name}" />
Year:
<input type="text" th:field="*{year}" />
现在我想在年份字段中进行一些验证。 例如,如果用户在该字段中输入字符串而不是数字,则当前代码将抛出异常,因为它不允许在整数属性中设置字符串。
那么如何验证输入呢? 不想使用@Valid。想做一些自定义验证。
我发现这样做的方法是在模型中创建年份字段的字符串版本(getter/setter)。然后在视图中使用该 strYear 并在控制器中进行验证。就像下面更新的代码一样。这是正确的方法还是有更好的方法来做到这一点?我问是因为不确定为每个需要验证的数字属性创建字符串版本的 getter/setter 是否正确。似乎有很多重复。
型号
@Entity
public class Person implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private int year;
@Transient
private String strYear;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public String getStrYear() {
return strYear;
}
public void setStrYear(String strYear) {
this.strYear = strYear;
}
}
控制器
@RequestMapping(value = "/person", method = RequestMethod.POST)
public ModelAndView editPerson(@ModelAttribute Person person)
{
//validate
boolean valid = Validate(Person.getStrYear());
if(valid==true)
{
Person.setYear(Integer.ParseInt(Person.getStrYear()));
//save edit
}
else
{//display validation messages}
//display results
ModelAndView modelAndView = new ModelAndView("Person.html");
modelAndView.addObject("personBind", person);
return modelAndView;
}
查看
<form action="person" method="post" th:object="${personBind}">
Name:
<input type="text" th:field="*{name}" />
Year:
<input type="text" th:field="*{strYear}" />
【问题讨论】:
-
不想使用@Valid注解是什么想法?因为,这通常是我们在 Spring MVC 中进行验证的方式。
-
几个原因。 1)我的表单中有一些不在模型实体中的字段。了解
@Valid无法验证。所以想法会以相同的方式进行所有验证,而不是与@Valid分开并以不同的方式分开。 2)不确定如何使用@Valid执行自定义验证(假设我需要执行计算以说明输入是否正确,甚至检查是否在我发布的这个问题中的数字字段中输入了字符串)。可能是这样,只是我不知道。 -
验证可能很棘手,但您提出的所有问题都可以通过 @Valid 注释解决。我会一起为您解答,但需要一些时间才能正确写出。
-
@hooknc 我在使用
@Valid时遇到的另一个问题是我在这个问题上发布的问题:stackoverflow.com/questions/65190605/…
标签: java spring-mvc thymeleaf