[Spring MVC] probleme avec <spring:bind>
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
Citation:
javax.servlet.ServletException: tried to access method org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue
Voici une partie de mon createApplication-servlet.xml:
Code:
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:
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:
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:
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:
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 :(