Bonjour,
Je développe une application Web qui utilise Spring & Spring MVC dans leur version 3.2.1
Je n'avais pas de problème jusqu'à ce que je souhaite créer un formulaire avec une checkbox correspondant à un Boolean dans mon model.
Lors de la soumission de mon formulaire, si ma checkbox n'est pas coché j'obtiens le message d'erreur suivant :
Si la case est coché, pas de problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 org.springframework.beans.NotReadablePropertyException: Invalid property 'charteAccepted' of bean class [com.teamIT.common.dto.utilisateur.UserDTO]: Bean property 'charteAccepted' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:707) at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:699) at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99) at org.springframework.validation.AbstractBindingResult.rejectValue(AbstractBindingResult.java:105) at org.springframework.validation.AbstractErrors.rejectValue(AbstractErrors.java:118) at com.teamIT.web.validator.SignupValidator.validate(SignupValidator.java:54) at com.teamIT.web.controller.authentification.SignupController.signup(SignupController.java:61) [...]
Je pense que c'est lié à cette histoire qu'en HTML une checkbox non cochée n'est pas soumise dans le formulaire, mais j'utilise les taglib form:checkbox qui est censé gérer le problème avec un champ caché.
Voici les extraits de mon code :
jsp :
controleur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <form:form id="signupForm" action="/signup.do" method="post" modelAttribute="user"> [...] <form:checkbox id="chart" path="chartAccepted" /> [...]
mon DTO qui me sert de model pour mon formulaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 @Autowired private SignupValidator signupValidator; @Autowired private IUserService userService; @Autowired private PasswordEncoder passwordEncoder; @InitBinder public void binder(Locale locale, WebDataBinder binder) { binder.registerCustomEditor(Date.class, new DateEditor(locale)); } @RequestMapping(method = RequestMethod.GET) public String signup(@ModelAttribute("user") UserDTO user) { return "public/signup"; } @RequestMapping(method = RequestMethod.POST) public String signup(@Valid @ModelAttribute("user") UserDTO user, BindingResult result, RedirectAttributes redirectAttributes) { //Additional validator (using both JSR-303 and spring Validator) signupValidator.validate(user, result); if (result.hasErrors()) { return "public/signup"; } String encodedPassword = passwordEncoder.encode(user.getPassword()); user.setPassword(encodedPassword); user.setActive(true); userService.saveNewUser(user); redirectAttributes.addFlashAttribute("message", "You have successfully signed up and logged in."); return "redirect:/"; }
et enfin mon validateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public class UserDTO extends AbstractDto { @NotNull(message = "{champ.obligatoire}") private Boolean chartAccepted; /** * @return the chartAccepted */ public Boolean getChartAccepted() { return chartAccepted; } /** * @param chartAccepted * the chartAccepted to set */ public void setChartAccepted(Boolean chartAccepted) { this.chartAccepted = chartAccepted; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 @Override public void validate(Object target, Errors errors) { if (target instanceof UserDTO) { UserDTO userDTO = (UserDTO) target; if (!userDTO.getChartAccepted()) { errors.rejectValue("charteAccepted", "error.signupForm.chartNotAccept"); } String email = userDTO.getEmail(); if (userService.findUserByEmail(email) != null) { errors.rejectValue("email", "error.signupForm.email.alreadyExist"); } } }
Qu'est-ce qui ne va pas dans mon code ?
Partager