限制注释@Notnull和@Size不能在Spring Bean中生效

时间:2017-11-06 07:55:29

标签: spring validation spring-mvc

我想使用注释来检查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>

我点击注册按钮的效果:

enter image description here

如果我在ID字段中键入一些数字并将其他数字保留为空,则验证将被传递,但我认为我在Spitter bean上设置了@NotNull@Size注释,所以它是春天不能合理地验证它并跳转到另一页。但事实上,确实如此,我的代码出了什么问题?

3 个答案:

答案 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
    }