Bonjour,
Je m'appuie sur le guide de Serge Tahe pour créer pas à pas une appli web en Spring MVC. Tout se passe bien jusqu'à l'utilisation de la balise <spring:bind> pouir valider un formulaire. Je pense àavoir tout fait comme M. Tahe, et pourtant...
J'ai une erreur
javax.servlet.ServletException: tried to access method org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue
Voici une partie de mon createApplication-servlet.xml:
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
<beans>
	<!-- les mappings de l'application-->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/createApplication.html">CreateApplicationController</prop>
			</props>
		</property>
	</bean>
	<!-- les contrôleurs de l'application-->
	<bean id="CreateApplicationController"
		class="controller.CreateApplicationController" autowire="byName">
		<property name="sessionForm">
			<value>true</value>
		</property>
		<property name="commandName">
			<value>createApplicationForm</value>
		</property>
		<property name="commandClass">
			<value>forms.CreateApplicationForm</value>
		</property>
		<property name="formView">
			<value>createApplication</value>
		</property>
		<property name="successView">
			<value>confirmCreateApplication</value>
		</property>
		<property name="validator">
			<ref bean="createApplicationFormValidator"/>
		</property>
	</bean>
	<!-- le validateur de formulaire -->
	<bean id="createApplicationFormValidator" 
		class="controller.validator.ValidateCreateApplicationForm"/>
Mon 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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class CreateApplicationController extends SimpleFormController {
 
	@Resource
	private ApplicationManager applicationManager;
 
	public ApplicationManager getApplicationManager() {
		return applicationManager;
	}
 
	public void setApplicationManager(ApplicationManager applicationManager) {
		this.applicationManager = applicationManager;
	}
 
	/**
         * Création d'une application 
         * @param request
         * @param response
         * @return
         */
	private ModelAndView create(HttpServletRequest request,
			HttpServletResponse response) {
		CreateApplicationForm createApplicationForm = (CreateApplicationForm) request.getSession().getAttribute(
		"createApplicationForm");
		Application app = new Application();
		app.setComment(createApplicationForm.getComment());
		app.setName(createApplicationForm.getName());
		app.setTrigram(createApplicationForm.getTrigram());
		applicationManager.add(app);
		// on rend un [ModelAndView]
		return new ModelAndView("confirmCreateApplication", null);
	}
 
	@Override
	protected Object formBackingObject(HttpServletRequest request) {
		// on récupère le formulaire dans la session s'il existe
		CreateApplicationForm createApplicationForm = (CreateApplicationForm) request.getSession().getAttribute(
				"createApplicationForm");
		if (createApplicationForm == null) {	
			createApplicationForm = new CreateApplicationForm();
		}
		// on rend le formulaire
		return createApplicationForm;
	}
 
	// traitement du POST
	@Override
	protected ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, Object createApplicationForm,
			BindException errors) {
		// on met le formulaire dans la session
		request.getSession().setAttribute("createApplicationForm",
				createApplicationForm);
		// on rend un [ModelAndView]
		return create(request, response);
	}
 
}
Mon objet 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
public class CreateApplicationForm {
 
	/**
         * Le nom de l'application
         */
	private String name;
	/**
         * @return the name
         */
	public String getName() {
		return name;
	}
	/**
         * @param name the name to set
         */
	public void setName(String name) {
		this.name = name;
	}
et enfin ma jsp à probleme:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<body>
createApplication
	<form method="post">
		<table>
			<tr>
				<spring:bind path="createApplicationForm.name">
					<td><input type="text" name="${status.expression}" value="${status.value}" /></td>
					<td>${status.errorMessage}</td>
				</spring:bind>
			</tr>
		</table>
	</form>
</body>
C'est a priori la partie en gras qui pose probleme. Lorsque je veux accéder à mon formulaire, au lieu de m'afficher le champ d'input vide et le bouton submit, j'ai
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
43
44
45
46
47
48
org.apache.jasper.JasperException: Exception in JSP: /views/createApplication.jsp:17
 
14: 	<form method="post">
15: 		<table>
16: 			<tr>
17: 				<spring:bind path="createApplicationForm.name">
18: 					
19: 					<td><input type="text" name="${status.expression}" value="${status.value}" /></td>
20: 					<td>${status.errorMessage}</td>
 
 
Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)
	org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:251)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1160)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 
root cause
 
javax.servlet.ServletException: tried to access method org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(Ljava/lang/String;)Ljava/lang/Object; from class org.springframework.web.servlet.support.BindStatus
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774)
	org.apache.jsp.views.createApplication_jsp._jspService(createApplication_jsp.java:135)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:171)
	org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:251)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1160)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:901)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
Le seule différence que je vois avec le tutorial de Serge Tahe est que lui crée une instance de son formulaire dans son interface IMetier (l'équivalent de mon applicationManager) pour initialiser les champs. J'ai essayé mais ca n'a rien changé. Je ne comprends pas mon erreur