以下控制器提供一个简单的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
作为模板引擎。但同样的问题适用于jsp
或jsf
引擎。
答案 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