Rails: annotate gem – problem z generowaniem
Tym razem krótko o RoR. Poznaję język i jednocześnie framework (3.1), przerabiając kolejne tutoriale.
Natrafiłem na problem przy tworzeniu modelu, a dokładnie przy generowaniu adnotacji do modelu.
Zainstalowałem potrzebny gem annotate
gem 'annotate', '2.4.0'
Przy próbie generowania adnotacji za pomocą komendy:
bundle exec annotate --position before
otrzymałem komunikat:
/usr/local/rvm/gems/ruby-1.9.3-preview1/gems/activerecord-3.1.0/lib/active_record/railties/databases.rake:3:in `<top (require d)>': undefined method `namespace' for main:Object (NoMethodError) from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/activerecord-3.1.0/lib/active_record/railtie.rb:26:in `load' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/activerecord-3.1.0/lib/active_record/railtie.rb:26:in `block in <cl ass:Railtie>' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/railtie.rb:183:in `call' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/railtie.rb:183:in `block in load_tasks' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/railtie.rb:183:in `each' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/railtie.rb:183:in `load_tasks' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/engine.rb:395:in `block in load_tasks' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/application/railties.rb:8:in `each' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/application/railties.rb:8:in `all' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/engine.rb:395:in `load_tasks' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/application.rb:99:in `load_tasks' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/railties-3.1.0/lib/rails/railtie/configurable.rb:30:in `method_miss ing' from Rakefile:7:in `<top (required)>' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/annotate-2.4.0/lib/annotate.rb:17:in `load' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/annotate-2.4.0/lib/annotate.rb:17:in `load_tasks' from /usr/local/rvm/gems/ruby-1.9.3-preview1/gems/annotate-2.4.0/bin/annotate:66:in `<top (required)>' from /usr/local/rvm/gems/ruby-1.9.3-preview1/bin/annotate:19:in `load' from /usr/local/rvm/gems/ruby-1.9.3-preview1/bin/annotate:19:in `<main>'
Problem jest brak ‚require rake’. Problem został rozwiązany ale chyba jeszcze nie ma wersji stabilnej z fixem.
Aby generowanie zaczęło działać wystarczy wcześniej wymienioną linijkę zamienić na:
gem 'annotate', '2.4.0', :git => 'git://github.com/jeremyolliver/annotate_models.git', :branch => 'rake_compatibility'
Oczywiście później w wierszu poleceń wywołujemy komendę
bundle install
Symfony2: No Metadata Classes to process.
Przy próbie wygenerowania sql’a dla utworzonej encji otrzymałem taki oto komunikat:
No Metadata Classes to process.
Encja była wygenerowana poleceniem (Symfony version 2.0.0-RC1):
./app/console gen:doctrine:entity
Wyświetlenie sql:
./app/console doctrine:schema:create --dump-sql
Przyczyny takiego komunikatu mogą być różne. U mnie był to problem z adnotacjami.
Przykładowe adnotacje po wygenerowaniu encji:
/** * Acme\MyBundle\Entity\News * * @Table() * @Entity */
Pierwsza próba to dodanie \:orm do każdej adnotacji, czyli:
/** * Acme\MyBundle\Entity\News * * @orm:Table() * @orm:Entity */
To nie pomogło (a znajdziecie sporo postów w sieci z podobnym kodem). Taki sposób już nie działa. Zmiana nastąpiła przy przejściu z beta1 na beta2.
Prawidłowa wersja to (zgodnie z dokumentacją):
/** * Acme\MyBundle\Entity\News * * @ORM\Table() * @ORM\Entity */
Super, tylko dlaczego generator nie dodał tego automatycznie skoro mam RC1 a zmiana była w beta? Pewnie jakiś błąd 😉 Zaktualizowałem symfony do wersji 2.0.0-RC3 i problem rozwiązany – generator automatycznie dodaje @ORM\.
Oby jak najszybciej wydali wersję finalną 🙂
Seam – adnotacja @Name nie działa
W przykładowym projekcie zamieniłem zapis o ziarnie z konfiguracji w faces-config.xml na adnotację @Name.
import java.util.Date; import org.jboss.seam.annotations.Name; @Name("ziarno") public class Bean { public Date getCurrentDate() { return new Date(); } }
i w szablonie
<h:outputText value="#{ziarno.currentDate}" />
Niestety kod przestał działać, tzn nie zwracał żadnej wartości. Nie było żadnych wyjątków.
Rozwiązanie okazało się proste.
Wystarczyło dodać plik seam.properties w katalogu /projekt/src/main/resources
Seam – problem z uruchomieniem projektu (org.jboss.seam.jsf.SeamViewHandler.calculateLocale)
Chciałem utworzyć jakiś prosty projekt w JBoss Seam 2.x, w związku z tym w ustawieniach Maven‚a dodałem dane o repozytoriach jboss’a. Kolejnym krokiem było wygenerowanie struktury projektu z jakiegoś archetypu (nie pamiętam już jakiego archetypu użyłem, ale na pewno coś z puli dostępnych w repo jboss’a). Projekt utworzyłem w NetBeans, jako serwer Tomcat 7.0.11.
Oczywiście odpalenie projektu rzuciło „pięknym” wyjątkiem:
W zakładce „Apache Tomcat 7.0.11 Log”:
2011-05-29 10:49:38 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/mavenproject3] threw exception [null] with root cause java.lang.NullPointerException at org.jboss.seam.jsf.SeamViewHandler.calculateLocale(SeamViewHandler.java:55) at com.sun.facelets.FaceletViewHandler.calculateLocale(FaceletViewHandler.java:790) at org.ajax4jsf.application.ViewHandlerWrapper.calculateLocale(ViewHandlerWrapper.java:65) at com.sun.faces.application.ViewHandlerImpl.createView(ViewHandlerImpl.java:372) at org.jboss.seam.jsf.SeamViewHandler.createView(SeamViewHandler.java:68) at com.sun.facelets.FaceletViewHandler.createView(FaceletViewHandler.java:803) at org.ajax4jsf.application.ViewHandlerWrapper.createView(ViewHandlerWrapper.java:79) at org.ajax4jsf.application.AjaxViewHandler.createView(AjaxViewHandler.java:93) at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:204) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:103) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)
Z kolei w zakładce W zakładce „Apache Tomcat 7.0.11”
2011-05-29 10:53:00 org.jboss.seam.jsf.SeamPhaseListener beforePhase SEVERE: swallowing exception java.lang.NullPointerException at org.jboss.seam.Component.getInstance(Component.java:2010) at org.jboss.seam.Component.getInstance(Component.java:2003) at org.jboss.seam.Component.getInstance(Component.java:1997) at org.jboss.seam.Component.getInstance(Component.java:1970) at org.jboss.seam.web.Session.getInstance(Session.java:122) at org.jboss.seam.contexts.FacesLifecycle.beginRequest(FacesLifecycle.java:56) at org.jboss.seam.jsf.SeamPhaseListener.beforeRestoreView(SeamPhaseListener.java:380) at org.jboss.seam.jsf.SeamPhaseListener.beforeServletPhase(SeamPhaseListener.java:139) at org.jboss.seam.jsf.SeamPhaseListener.beforePhase(SeamPhaseListener.java:117) at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:214) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:96) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:103) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) 2011-05-29 10:53:00 com.sun.faces.lifecycle.Phase doPhase SEVERE: JSF1054: (Phase ID: RESTORE_VIEW 1, View ID: ) Exception thrown during phase execution: javax.faces.event.PhaseEvent 2011-05-29 10:53:00 org.jboss.seam.jsf.SeamPhaseListener afterPhase WARNING: uncaught exception, passing to exception handler java.lang.NullPointerException at org.jboss.seam.jsf.SeamPhaseListener.raiseEventsAfterPhase(SeamPhaseListener.java:435) at org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:188) at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:103) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) 2011-05-29 10:53:00 org.jboss.seam.jsf.SeamPhaseListener afterPhase SEVERE: swallowing exception java.lang.NullPointerException at org.jboss.seam.jsf.SeamPhaseListener.raiseEventsAfterPhase(SeamPhaseListener.java:435) at org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:188) at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:103) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) 2011-05-29 10:53:00 org.ajax4jsf.webapp.BaseXMLFilter doXmlFilter SEVERE: Exception in the filter chain javax.servlet.ServletException at javax.faces.webapp.FacesServlet.service(FacesServlet.java:277) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.NullPointerException at org.jboss.seam.jsf.SeamViewHandler.calculateLocale(SeamViewHandler.java:55) at com.sun.facelets.FaceletViewHandler.calculateLocale(FaceletViewHandler.java:790) at org.ajax4jsf.application.ViewHandlerWrapper.calculateLocale(ViewHandlerWrapper.java:65) at com.sun.faces.application.ViewHandlerImpl.createView(ViewHandlerImpl.java:372) at org.jboss.seam.jsf.SeamViewHandler.createView(SeamViewHandler.java:68) at com.sun.facelets.FaceletViewHandler.createView(FaceletViewHandler.java:803) at org.ajax4jsf.application.ViewHandlerWrapper.createView(ViewHandlerWrapper.java:79) at org.ajax4jsf.application.AjaxViewHandler.createView(AjaxViewHandler.java:93) at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:204) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:103) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) ... 26 more
Dość długą chwilę szukałem rozwiązania (znalezione odpowiedzi na różnych forach nie pomagały), ale dzisiaj się udało.
Rozwiązanie banalne. W pliku web.xml wystarczyło dodać następujący kod:
<listener> <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> </listener>
W sumie banał, ale może pomóc niejednemu początkującemu 🙂
NetBeans + Maven: Integracja Spring Framework 3 z Struts2
W dzisiejszym poście zaprezentuję jak rozpocząć pracę z Spring Framework 3 oraz Struts2, wykorzystując do tego środowisko NetBeans (u mnie 6.9.1) oraz Maven 2. Jak zwykle zaprezentuję całą ścieżkę, łącznie z problemami jakie napotkałem 😛
Aby utworzyć projekt należy wybrać przejść kolejne kroki kreatora:
New Project -> Maven -> Maven Project
Z listy „Maven Archetypes” wybieramy „Archetypes from Local Respository” i zaznaczamy „Maven Webapp Archetype (1.0)„. W kolejnym oknie wypełniamy odpowiednie pola i po kliknięciu zostanie wygenerowany projekt. Pierwszy krok to dodanie zależności do pliku pom.xml (dostępny w gałęzi „Project Files„).
Do wykonania i uruchomienia projektu potrzebne są podstawowe paczki z org.springframework, paczka struts2-core, oraz plugin pozwalający na współpracę między Spring a Struts.
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-asm</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${org.apache.struts.version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>${org.apache.struts.version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>${org.apache.struts.version}</version> </dependency> </dependencies>
Jak widać zamiast wersji bibliotek użyłem ${org.springframework.version} oraz ${org.apache.struts.version}, oczywiście celowo – żeby w jednym miejscu zdeklarować numer wersji:
<properties> <org.springframework.version>3.0.4.RELEASE</org.springframework.version> <org.apache.struts.version>2.2.1</org.apache.struts.version> </properties>
Po zapisaniu pliku można w menu kontekstowego gałezi „Libraries” wybrać „Download Missing Dependencies„.
Kolejny krok to utworzenie przykładowego kontrolera i konfiguracja Springa oraz Struts.
W tym celu w gałęzi „Source packages” tworzymy dowolną paczkę i dodajemy prostą klasę, niech to będzie klasa z akcją „Hello world”.
package eu.ryznar; public class Hello { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String execute() { return "SUCCESS"; } }
W „Web Pages” tworzymy plik success.jsp:
<html> <body> <h2>Success</h2> ${message} </body> </html>
Teraz czas na konfigurację. W web.xml listener dla Springa oraz filter dla Struts2
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
Przeglądając różne tutoriale możecie trafić na przykład gdzie zamiast org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter została użyta klasa org.apache.struts2.dispatcher.FilterDispatcher. To zależy od wersji Struts2. Od wersji 2.1.3 FilterDispatcher jest oznaczona jako przestarzała.
Następnie w katalogu WEB-INF tworzymy plik applicationContext.xml w którym skonfigurujemy ziarna, w tym przypadku klasę „Hello”.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloClass" class="eu.ryznar.Hello" > <property name="message" value="Hello World!" /> </bean> </beans>
Następnie również w katalogu WEB-INF tworzymy plik struts.xml w którym definiujemy która klasa wykonuje akcję i zwraca odpowiedni widok.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default"> <action name="hello" class="helloClass"> <result name="SUCCESS">/success.jsp</result> </action> </package> </struts>
Atrybut „class” nie wskazuje bezpośrenio na klasę eu.ryznar.Hello a na ziarno zdefiniowane w pliku konfiguracyjnym Springa.
Przed uruchomieniem należy ustawić serwer. We właściwościach projektu, w gałęzi „Run” wybieramy serwer Tomcat.
To wszystko, czas uruchomić aplikację. Jednak czeka nas niespodzianka 😉 w konsoli dostaniemy taki oto wyjątek:
2010-10-11 21:01:56 org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext 2010-10-11 21:01:57 org.apache.catalina.core.StandardContext filterStart SEVERE: Exception starting filter struts2 java.lang.reflect.InvocationTargetException - Class: com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector File: ContainerImpl.java Method: inject Line: 295 - com/opensymphony/xwork2/inject/ContainerImpl.java:295:-1 at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:428) at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295) at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422) at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:115) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3838) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4488) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:521) at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1359) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761) at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1500) at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:849) at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:351) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:199) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:558) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:295) at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.construct(ContainerImpl.java:431) at com.opensymphony.xwork2.inject.ContainerBuilder$5.create(ContainerBuilder.java:207) at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:51) at com.opensymphony.xwork2.inject.ContainerBuilder$3.create(ContainerBuilder.java:93) at com.opensymphony.xwork2.inject.ContainerBuilder$7.call(ContainerBuilder.java:487) at com.opensymphony.xwork2.inject.ContainerBuilder$7.call(ContainerBuilder.java:484) at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:574) at com.opensymphony.xwork2.inject.ContainerBuilder.create(ContainerBuilder.java:484) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.createBootstrapContainer(DefaultConfiguration.java:252) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:193) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:371) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:415) ... 41 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:293) ... 54 more Caused by: java.lang.ExceptionInInitializerError at com.opensymphony.xwork2.ognl.OgnlValueStackFactory.setContainer(OgnlValueStackFactory.java:85) ... 59 more Caused by: java.lang.IllegalArgumentException: Javassist library is missing in classpath! Please add missed dependency! at ognl.OgnlRuntime.(OgnlRuntime.java:165) ... 60 more Caused by: java.lang.ClassNotFoundException: javassist.ClassPool at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:169) at ognl.OgnlRuntime.(OgnlRuntime.java:162) ... 60 more 2010-10-11 21:01:57 org.apache.catalina.core.ApplicationContext log INFO: Closing Spring root WebApplicationContext
Co się okazuje w wersji 2.2.1 wykluczono z zależności Javassist, dlatego trzeba dodać zależność ręcznie w pom.xml
<dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.9.0.GA</version> </dependency>
Próbujemy jescze raz uruchomić projekt. W przeglądarce zostaje otworzony plik index.jsp, jednak my chcemy zobaczyć wynik akcji hello, dlatego w pasku adresu zamiast index.jsp wpisujemy hello.action. Niestety strona się nie wyświetla a w konsoli widzimy kolejny wyjątek.
There is no Action mapped for namespace / and action name helloWorld. - [unknown location] at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:189) at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61) at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39) at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:475) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:619)
Tym razem okazuje się że plik struts.xml powinien znajdować się w /WEB-INF/classes/ a nie tak jak teraz bezpośrednio w /WEB-INF/
Po tej poprawce projekt uruchomi się poprawnie. Mam nadzieję że wpis pomoże jakiemuś początkującemu programiście 🙂 Jeśli ktoś miałby jakieś uwagi to chętnie je poznam 🙂
Problem z utworzeniem projektu Spring Roo (STS @ Ubuntu)
Postanowiłem wypróbować Spring Roo. Żeby ułatwić sobie pracę z projektem pobrałem środowisko STS (SpringSource Tool Suite 2.3.2.RELEASE) wersja na Linuxa 64 bit (korzystam z Ubuntu 9.04).
Instalacja środowiska przebiegła bez problemów, uruchomienie również, dodatkowo ustaliłem sobie scieżkę systemową do katalogu z Roo. Schody zaczęły się w momencie tworzenia nowego projektu Roo. Podałem „project name” oraz „top level package name”, i po kliknięciu na „finish” nic się nie pojawiło. Żadnego projektu w „project explorer”, żadnych błędów. Konsoli Roo też nie mogłem otworzyć bo nie widziała żadnych projektów.
W katalogu w którym miał zostać utworzony projekt znalazły się trzy pliki i jeden katalog (log, .classpath, .project oraz .settings).
W związku z tym że w sieci nie znalazłem żadnych informacji na ten temat, projekt Roo utworzyłem samodzielnie w konsoli, a następnie wczytałem go do STS’a przez:
New -> Project -> General -> Project, a następnie w polu „Location” wybrałem ścieżkę do projektu.
W tym momencie dostałem komunikat (nie pamiętam dokładnie treści) z pytaniem czy włączyć jakąś usługę (JDT Weaving), oczywiście potwierdziłem, środowisko zostało zrestartowane, a projekt wczytany. System zwrócił również komunikat „The JDT Weaving service has been enabled”.
Następnie z poziomu STS’a ponownie spróbowałem utworzyć nowy projekt Roo i tym razem się udało (trochę to trwało bo STS przebudowywał workspace). Kolejne projekty są tworzone bardzo szybko. Konsola Roo uruchamia się poprawnie dla każdego projektu.
Mam nadzieję ten wpis jeszcze się komuś przyda 🙂
symfony – problemy po konfiguracji bazy danych
Dzisiaj trochę z innej beczki. Właśnie próbuję przejrzeć tutorial symfony 1.4 (jobeet) + propel. Ledwo doszedłem do 3 rozdziału a już problemy 😉 O co chodzi. Chciałem wykonać wykonać następujące polecenie (system Ubuntu):
symfony propel:insert-sql
Komenda ta zwróciła następujący błąd:
[propel-sql-exec] Failed to execute: [propel-sql-exec] SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected [propel-sql-exec] Failed to execute:
A przecież wcześniej konfigurowałem połączenie poleceniem (zgodnie z tym co pisze w tutorialu):
symfony configure:database "mysql:host=localhost;dbname=jobeet" root mojeHaslo
Pliki database.yml i propel.ini zostały poprawnie wygenerowane.
Co się okazuje wystarczy tylko zmienić kolejność w powyższym poleceniu, czyli nazwa bazy na początek:
symfony configure:database "mysql:dbname=jobeet;host=localhost" root mojeHaslo
I teraz wszystko działa. Krótka notka ale może komuś się przyda 🙂
Najnowsze komentarze