使用spring-mvc在网页上显示验证错误?

时间:2017-08-10 14:06:59

标签: java spring jsp spring-mvc thymeleaf

以下控制器提供一个简单的html页面,显示存储库中的所有人员。

问题:我在get-query上使用验证约束。如果查询无效(在我的示例中:lastname参数丢失),则spring会自动抛出异常作为对浏览器的响应。

但是我仍然希望呈现persons.html页面,只显示存储库内容的错误。

问题:我怎么能实现这个目标?因为如果验证失败,则甚至无法访问以下方法。

@Controller
@RequestMapping("/persons")
public class PersonController {
    @GetMapping //note: GET, not POST
    public String persons(Model model, @Valid PersonForm form) {
        //on the persons.html page I want to show validation errors

        model.addAttribute("persons", dao.findAll());
        return "persons";
    }
}

public class PersonForm {
    private String firstname;

    @NotBlank
    private String lastname;
}

旁注:我正在使用thymeleaf作为模板引擎。但同样的问题适用于jspjsf引擎。

2 个答案:

答案 0 :(得分:1)

BindingResult bindingResult方法中需要额外的persons参数。您可以使用此bindingResult查看是否存在验证错误。

Spring有一个很好的指南,展示了如何做到这一点。 见https://spring.io/guides/gs/validating-form-input/

答案 1 :(得分:1)

添加BindingResult应解决此问题,因为@obecker指出。我看到了您的评论,它也适用于GetMapping@PostMapping

请检查一下:

@SpringBootApplication
public class So45616063Application {

    public static void main(String[] args) {
        SpringApplication.run(So45616063Application.class, args);
    }

    public static class PersonForm {
        private String firstname;
        @NotBlank
        private String lastname;

        public void setFirstname(String firstname) {
            this.firstname = firstname;
        }

        public void setLastname(String lastname) {
            this.lastname = lastname;
        }

        @Override
        public String toString() {
            return firstname + " " + lastname;
        }
    }

    @RestController
    @RequestMapping("/")
    public static class Home {

        @GetMapping
        public void get(@Valid PersonForm form, BindingResult bindingResult) {
            System.out.println(form);
            System.out.println(bindingResult);
        }
    }
}

呼叫:

curl -XGET 'localhost:8080?firstname=f&lastname=l'

会产生输出:

f l
org.springframework.validation.BeanPropertyBindingResult: 0 errors

呼叫:

curl -XGET 'localhost:8080?firstname=f'

将产生:

f null
org.springframework.validation.BeanPropertyBindingResult: 1 errors