我想使用注释来检查bean的属性,但@NotNull
和@Size
注释不会生效。请参阅下面的代码:
Spitter bean:
package spittr.data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class Spitter {
private int id;
@NotNull
@Size(min=5, max=25)
private String password;
@NotNull
@Size(min=2, max=30)
private String firstName;
@NotNull
@Size(min=2, max=30)
private String lastName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String toString()
{
return "id:" + id + "\n" +
"firstName:" + firstName + "\n"+
"lastName:" +lastName+"\n"+
"password:" + password;
}
}
SpitterController:
package spittr.web;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import spittr.data.Spitter;
import spittr.data.SpitterRespository;
@Controller
@RequestMapping("/spitter")
public class SpitterController {
private SpitterRespository spitterRespository;
public SpitterRespository getSpitterRespository() {
return spitterRespository;
}
@Autowired
public void setSpitterRespository(SpitterRespository spitterRespository) {
this.spitterRespository = spitterRespository;
}
@RequestMapping(value="/register", method=RequestMethod.GET)
public String showRegistrationForm(Model model)
{
model.addAttribute("spitter",new Spitter());
System.out.println("SpitterController.showRegistrationForm is called");
return "registForm";
}
@RequestMapping(value="/register", method=RequestMethod.POST)
public String processRegistration(@Valid Spitter spitter, Errors errors)
{
if (errors.hasErrors())
{
return "registForm";
}
System.out.println("SpitterController.processRegistration is called");
System.out.println(spitter.toString());
spitterRespository.saveSpitter(spitter);
return "redirect:/spitter/"+spitter.getId();
}
@RequestMapping(value="/{userId}", method=RequestMethod.GET)
public String showSpitterProfile(@PathVariable("userId") String userId, Model model)
{
System.out.println("SpitterController.showSpitterProfile is called");
Spitter spitter = spitterRespository.findSpitterById(userId);
model.addAttribute("Spitter",spitter);
return "userprofile";
}
}
registForm.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>Register</h1>
<sf:form method="POST" modelAttribute="spitter">
User ID: <sf:input path="id" /><sf:errors path="id" /> <br />
First Name: <sf:input path="firstName" /><sf:errors path="firstName" /> <br/>
Last Name: <sf:input path="lastName" /><sf:errors path="lastName" /> <br/>
Password: <sf:input path="password" /><sf:errors path="password" /> <br/>
<input type="submit" value="Register" />
</sf:form>
</body>
</html>
我点击注册按钮的效果:
如果我在ID字段中键入一些数字并将其他数字保留为空,则验证将被传递,但我认为我在Spitter bean上设置了@NotNull
和@Size
注释,所以它是春天不能合理地验证它并跳转到另一页。但事实上,确实如此,我的代码出了什么问题?
答案 0 :(得分:0)
我认为您需要在此行中使用@Validated
注释,而不是@Valid
:
@RequestMapping(value="/register", method=RequestMethod.POST)
public String processRegistration(@RequestBody @Validated Spitter spitter, Errors errors)
答案 1 :(得分:0)
试试这个应解决问题:
@RequestMapping(value="/register", method=RequestMethod.POST)
public String processRegistration(@RequestBody @Valid Spitter spitter, Errors errors)
默认情况下,内容类型为application/json
,您发送的内容类型contentType="text/html"
不兼容。这就是你获得HTTP 415 error "Unsupported Media Type"
的原因。
您可以在控制器栏中明确定义内容类型,如下所示:
@RequestMapping(value="/register", method=RequestMethod.POST, consumes="text/html", produces="text/html")
答案 2 :(得分:0)
尝试这个:
@RequestMapping(value="/register", method=RequestMethod.POST)
public String processRegistration(@Valid @ModelAttribute("spitter") Spitter spitter,BindingResult bindingResult)
{
if (bindingResult.hasErrors())
{
return "registForm";
}
//rest of the code
}