IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Web Java Discussion :

[Spring MVC] probleme avec <spring:bind>


Sujet :

Spring Web Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 43
    Points : 28
    Points
    28
    Par défaut [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
    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

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Notez que quand j'écris dans ma JSP à probleme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <spring:bind path="createApplicationForm.*">
    					<td><input type="text" name="${status.expression}" value="${status.value}" /></td>
    					<td>${status.errorMessage}</td>
    				</spring:bind>
    Ca m'affiche correctement ma page. J'ai tendance à croire qu'il ne fait pas la correspondance entre "createApplication.name" et mon objet CreateApplicationForm qui a pour attribut name avec ses getters/setters.

    Or, comment faire pour que Spring MVC fasse cette correspondance ?

  3. #3
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    D'après l'erreur, on dirait qu'il n'est pas content lorsqu'il essaie de récupérer la valeur courante de name. Or, c'est vrai qu'elle est à nulle donc le problème pourrait venir de là.

    Sinon pour SpringMVC, tu as des tags plus pratiques. Voir le tutoriel officiel et la documentation (http://static.springframework.org/sp...-form.tld.html).

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 43
    Points : 28
    Points
    28
    Par défaut
    Merci, je vais creuser un peu cette taglib que tu m'as donnée pour contourner mon probleme

Discussions similaires

  1. [Spring MVC],[<form:input] pas de binding !
    Par Invité dans le forum Spring Web
    Réponses: 4
    Dernier message: 20/12/2007, 16h44
  2. Réponses: 2
    Dernier message: 29/11/2007, 15h25
  3. [Spring MVC] probleme avec ${message}
    Par Socrate93 dans le forum Spring Web
    Réponses: 5
    Dernier message: 18/09/2007, 11h53
  4. [Spring MVC] Problèmes avec SimpleFormController"s"
    Par SuperGandalf dans le forum Spring Web
    Réponses: 2
    Dernier message: 13/06/2007, 10h38
  5. [Spring MVC] Probleme d'affichage de pages jsp
    Par nouida dans le forum Spring Web
    Réponses: 1
    Dernier message: 04/02/2007, 23h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo