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 :

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)
	[...]
Si la case est coché, pas de problème.

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 :
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" />
   [...]
controleur :
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:/";
}
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
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;
}
 
}
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
 
@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 ?