Problem mit Spring

Molly_Grue

Mitglied
Hallo zusammen!

Ich bin mehr als neu im Bereich Java und Spring, daher entschuldigt bitte, wenn ich eine echt dumme Frage stellen sollte ;)

Ich habe im April einen neuen Job angenommen, bei dem mir auch gleich ein recht großes Java-Projekt vor die Nase gesetzt wurde, an dem ich nun weiterarbeiten darf. Ich kann also vermutlich nicht sehr präzise auf eure Fragen antworten :( Wenn ihr mir deswegen nicht weiterhelfen könnt, ist das halt so, muss ich halt selbst weiter im Nebel stochern ;)

Ich arbeite mit Eclipse, Spring und Hibernate. Nun habe ich eine neue Webseite in das Projekt "eingebastelt", was auch super geklappt hat. Wenn ich irgendetwas ausgeben lassen möchte (zB "Hallo Welt!") klappt das auch prima. Da meine Seite zwei anderen Seiten sehr ähnlich sein soll, habe ich den Inhalt der anderen Seite übertragen und nur entsprechende Stellen geändert (zB die Bezeichnungen der Felder, etc). Das gleiche habe ich mit dem Controller gemacht (Name der Seite: status-taskprotokoll.jsp; Name des Controllers: TaskprotokollController.java - ähnlich den anderen zwei Seiten). Leider wird aber wenn ich den Link im Menü klicke eine Exception geworfen. Daraufhin habe ich die Seite leer gemacht und nach und nach einzelne Tags eingefügt um zu sehen bei welchem Tag die Exception geworfen wird. Das passiert bei diesem Tag:
Code:
<spring:bind path="command">
Die Exception ist folgende (ich poste mal nicht alles, da ich eigentlich davon ausgehe, dass die weiteren "Folgefehler" sind):
Code:
2007-07-30 14:22:10,187 ERROR [org.springframework.web.servlet.tags.BindTag] - <Neither BindingResult nor plain target object for bean name 'command' available as request attribute>
javax.servlet.jsp.JspTagException: Neither BindingResult nor plain target object for bean name 'command' available as request attribute
	at org.springframework.web.servlet.tags.BindTag.doStartTagInternal(BindTag.java:118)
	at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:77)
	at org.apache.jsp.WEB_002dINF.jsp.Status.status_002dtaskprotokoll_jsp._jspService(org.apache.jsp.WEB_002dINF.jsp.Status.status_002dtaskprotokoll_jsp:128)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:594)
	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:505)
	at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:965)
	at org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:605)
	at org.apache.struts.tiles.TilesUtilImpl.doInclude(TilesUtilImpl.java:99)
	at org.apache.struts.tiles.TilesUtil.doInclude(TilesUtil.java:135)
	at org.apache.struts.taglib.tiles.InsertTag.doInclude(InsertTag.java:760)
	at org.apache.struts.taglib.tiles.InsertTag$InsertHandler.doEndTag(InsertTag.java:892)
	at org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:462)
	at org.apache.jsp.WEB_002dINF.jsp.siteLayout_jsp._jspx_meth_tiles_insert_3(org.apache.jsp.WEB_002dINF.jsp.siteLayout_jsp:188)
	at org.apache.jsp.WEB_002dINF.jsp.siteLayout_jsp._jspService(org.apache.jsp.WEB_002dINF.jsp.siteLayout_jsp:102)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
	at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:142)
	at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:247)
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1103)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:840)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:754)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:399)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:354)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:183)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
	at java.lang.Thread.run(Unknown Source)
In meinem jugendlichen Leichtsinn würde ich vermuten, dass ich endtweder die Klasse des Controllers oder etwas anderes noch irgendwo mit dem path (command) in dem spring:bind-Tag "mappen" muss, aber wie gesagt, ich habe keine Ahnung :confused:

Ich bin wirklich verzweifelt, sonst würde ich mit meinem Halbwissen (wobei halb noch echt geschmeichelt ist) nicht hier aufschlagen, da ich ja weiß wie schwer es ist Antworten zu geben, wenn man die Umgebung nicht kennt... Ich bemühe seit einer knappen Woche mein Hirn und Google, aber rausgekommen ist noch nichts, was mir weitergeholfen hätte :( Wenn ihr Fragen habt, nur zu, ich versuch sie dann so gut wie möglich zu beantworten (vllt aber erst morgen, ich denke über Frust-Feierabend nach...).

Liebe Grüße und Danke schonmal für eure Hilfe,
Molly
 
Hallo erstmal,

schön, das Spring dir so sprechende Fehlermeldungen liefert: "Neither BindingResult nor plain target object for bean name 'command' available as request attribute". Was sagt uns das? Du referenzierst in der JSP ein Objekt unter dem Namen 'command'. Das Tag schimpft nun aber, dass es keine Variable mit dem Namen 'comman' im Request findet.

Frage: hast du es denn dort hin getan? ;) Ich gehe mal davon aus, dass dein Controller von SimpleFormController erbt um ein Formular darzustellen? Dann solltest du in deiner XML Konfiguration irgendwo diesen Controller definiert und eine Property commandName gesetzt haben. Da sollte dann 'command' stehen. Du definierst damit quasi unter welchem Namen dein Command (warum das Ding so heißt weiß ich bis heute nicht - es ist eigentlich ein FormBackingObject) abgelegt wird, damit du in JSPs darauf zugreifen kannst.

Falls es das noch nicht ist, währe ein wenig Konfiguration + evtl. Controllercode recht hilfreich.

Gruß
Ollie

Edit: ich seh grad, du hast vom Controllermapping gar nichts geschrieben. Bist du dir sicher, dass du den Controller korrekt rufst und der auf deine JSP forwarded?
 
Hallo Ollie,

vielen Dank für Deine Antwort! :)

Ja, mein Controller erbt von SimpleFormController. Die Konfiguration habe ich von den anderen beiden Seiten "abgekupfert". Um es mal genauer zu sagen, es gibt zwei Seiten, die beide etwas aus einer Datenbank auslesen und in übersichtlicher Form anzeigen (ein Fehlerprotokoll und ein weiteres Protokoll). Die Seite, die ich eingefügt habe, soll auch Daten aus der Datenbank lesen und ebenso übersichtlich darstellen (noch ein Protokoll).

Die beiden anderen Seiten referenzieren beide das command-Objekt und in der Konfiguration (ich hoffe ich meine die richtige) ist bei beiden aber keine property commandName :confused:

Code:
<bean name="/status-fehlerprotokoll.html" class="de.elisa.web.Controller.Status.FehlerprotokollController">
   <property name="dao" ref="daoElisa"/>
   <property name="sessionForm" value="true"/>
   <property name="formView" value="status-fehlerprotokoll"/>
   <property name="successView" value="status-fehlerprotokoll"/>
</bean>

<bean name="/status-taskprotokoll.html" class="de.elisa.web.Controller.Status.TaskprotokollController">
   <property name="dao" ref="daoElisa"/>	
   <property name="sessionForm" value="true"/>
   <property name="formView" value="status-taskprotokoll"/>
   <property name="successView" value="status-taskprotokoll"/>
</bean>

Taskprotokoll ist das von mir...

Die Seite wird richtig aufgerufen, denn wenn ich die jsp leer lasse und den Link im Menü klicke, wird eine leere html angezeigt (ohne Exception). Also denke ich mal, dass ich das Mapping richtig gemacht habe.
 
Zuletzt bearbeitet:
Okay, das sieht ja erstmal nicht schlecht aus. Was aber noch völlig fehlt ist, wie du das durch das DAO geladene Objekt jetzt an den View weiterreichst. Dass der SFC völlig ohne Angabe von commandName bzw. commandClass arbeitet wundert mich schon.

Ohne überschreiben von formBackingObject(..) liefert der SFC nämlich eigentlich eine leere instanz des konfigurierten Command zurück. Scheinbar gibt er null zurück, wenn nix konfiguriert ist.

Was du auf jeden Fall machen solltest ist folgendes konfigurieren:

Code:
...
<property name="commandClass" value="foo.bar.DeineBeanKlasse" />
<property name="commandName" value="gibMirEinenNamen" />
...

Danach solltest du ohne Exception in der View auf das command zugreifen können
Code:
<spring:bind path="gibMirEinenNamen">...</spring:bind>
. Um das Objekt jetzt mit Werten zu füllen überschreibst du formBackingObject(..) und lädst da dein Objekt per DAO und gibst das zurück. Is quasi das Template Pattern ;)

Gruß
Ollie
 
Ich könnte mir vorstellen, dass Du den Teil des Controllers meinst (wenn nicht, dann poste ich doch mal den ganzen, wollte aber nicht gleich alles "vollspamen").

Code:
protected ModelAndView onSubmit(HttpServletRequest request,
		HttpServletResponse response, Object command, BindException errors)
		throws Exception {

    FormFilter fbo = (FormFilter) command;
    FilteredListHolder listHolder = (FilteredListHolder) fbo.getPageHolder();

    listHolder.refresh(true);

    HashMap map = showForm(request, errors, getFormView(), errors.getModel()).getModelMap();
    // -- //return new ModelAndView(new RedirectView("viewDestinations.view"),map);
    // return new ModelAndView(getFormView(), map);

    return showForm(request, response, errors) ;
	}

Ich muss nochmal sagen, das Projekt an dem ich hier weitermache ist ziemglich groß, hab fast ein schlechtes Gewissen, weil ich so wenig darüber sagen kann (weil es ja nicht von mir ist) :(
 
Nein, onSubmit wird erst nach dem Abschicken des Forumlars gerufen. Schau dir einfach mal den Workflow der CommanController im JavaDoc an. Da ist das sehr ausführlich beschrieben. Hast du die Sachen mittlerweile in der Konfiguration drin? Ohne die schreibt Spring dein command NICHT in den Request und dementsprechend kannst du dann darauf auch nicht zugreifen.

Gruß
Ollie
 
Hallo Ollie,

tut mir leid, dass ich mich so lange nicht gemeldet hab. Ich musste an einer anderen "Baustelle" weitermachen. Habe jetzt den ursprünglichen Entwickler des Projektes kontaktiert (er war zwei Wochen im Urlaub) und werde mal versuchen mit ihm das Problem zu lösen. Auf Anhieb konnte er nichts feststellen, kann also noch etwas dauern bis wir da was gefunden haben.

Ich poste dann hier, woran es gelegen hat, vorausgesetzt ich kann das nachvollziehen und in Worte fallsen :rolleyes:

Liebe Grüße,
Molly
 
Hallo Ollie,

der Fehler ist gefunden. Das ist sooooo peinlich... Es war ein simpler Tippfehler in der Servlet.xml den ich dauernd übersehen hab. Hab das x Mal überprüft, aber der ist mir immer wieder entgangen... Statt
Code:
<prop key="/status-taskprotokoll.html">/status-taskprotokoll.html</prop>
hatte ich
Code:
<prop key="/status-taksprotokoll.html">/status-taskprotokoll.html</prop>
*im boden versink* ;)

Falls Du es beim ersten hingucken nicht gleich siehst, hatte im ersten "taskprotokoll" s und k vertauscht...

Danke trotzdem nochmal für Deine Hilfe :)
Liebe Grüße,
Molly
 
Ist das aus deiner ViewResolver Konfiguration? Dann sollte er doch den view gar nicht finden, oder? Schonmal überlegt nen InternalResourceViewResolver zu verwenden? Sollte - wenn ich deine Conf richtig deute etwas an Konfigurationsaufwand sparen und Typos vorbeugen ;)

REINHAUN!
 

Neue Beiträge

Zurück