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 erreurVoici une partie de mon createApplication-servlet.xml:javax.servlet.ServletException: tried to access method org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue
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 <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 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
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); } }
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
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; }
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 <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>
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
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)![]()
Partager