Spring Boot-und die JSF/Primefaces/Richfaces
"Ich habe in Kontakt mit Feder nur für ein paar Monate jetzt, und vor kurzem kam auf Spring Boot beim durchstöbern der guides-section. Die guides waren sehr einfach zu vervollständigen und für einen guten ersten Einblick in die Projekte, die grundlegende (und tolle) Idee, die in der Lage sein, zu bauen und Bereitstellung von enterprise-level-Anwendungen mit einer minimalen Konfiguration hochhält, um eine Breite Palette von Spring/JEE gute Praktiken. Ich bin wirklich daran interessiert, mit Spring Boot für test-Projekte, weil Sie so viel einfacher und schneller einzurichten und zu betreiben und immer noch sehr nahe an meiner Produktionsumgebung.
Ich bin derzeit versucht, ein Projekt bauen, um mit Spring-Boot und Primefaces als meinen Blick auf die Technologie der Wahl, aber das setup scheinbar nicht bereit ist out-of-the-box, wie ist der Fall mit Thymeleaf, für die mit dem binären in das classpath ist genug. Ich habe versucht, einschließlich der folgenden gradle/maven-Artefakte, aber ohne Erfolg:
- primefaces
- jsf-api
- jsf-impl
- el-api
Spring Boot eingebetteten Tomcat-server startet ohne Fehler, aber nach dem Versuch, öffnen Sie eine Seite, wie Sie /Ansicht in einem browser, der embedded-server die folgende Fehlermeldung angezeigt: HTTP Status 500 - Circular view path: would dispatch back to the current handler URL again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
Nach der Suche in verschiedenen Orten, die ich noch nicht finden keine Ressourcen/tutorials, wie man ein solches Projekt.
Hier der Inhalt der my-build.gradle-Datei:
buildscript {
repositories {
maven { url "http://repo.spring.io/libs-snapshot" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.0.RC4")
}
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
idea {
module {
downloadJavadoc = true
}
}
group = 'com.hello'
version = '0.0.1-SNAPSHOT'
repositories {
mavenCentral()
mavenLocal()
maven { url "http://repository.primefaces.org" }
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
// compile ("org.thymeleaf:thymeleaf-spring4")
compile group: 'org.primefaces', name: 'primefaces', version: '4.0'
compile group: 'com.sun.faces', name: 'jsf-api', version: '2.2.2'
compile group: 'com.sun.faces', name: 'jsf-impl', version: '2.2.2'
compile group: 'javax.el', name: 'el-api', version: '1.0'
}
task wrapper(type: Wrapper) {
gradleVersion=1.10
}
Meine main-Klasse:
package com.hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@EnableAutoConfiguration
@ComponentScan
@Configuration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
und meine Implementierung von WebMvcConfigurerAdapter:
package com.hello;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("view");
registry.addViewController("/view").setViewName("view");
}
}
Zusammen mit meiner view.html Datei (ich habe auch versucht, anzeigen.xhtml), diese sind alle die Dateien, die ich für dieses Projekt erstellt haben, wie ich versucht bin für das minimal-setup.
Wenn jeder sehen kann was ich falsch mache (oder nicht tut überhaupt), Hilfe wäre sehr geschätzt werden.
Brauche ich zusätzliche Dateien/beans JSF-Konfiguration in diesem Fall? Wenn ja, wo und wie sollten solche Dateien?
Diese Frage wurde auch veröffentlicht in der offiziellen Frühling Foren:
http://forum.spring.io/forum/spring-projects/boot/746552-spring-boot-and-jsf-primefaces-richfaces
BEARBEITEN:
Nach wie M. Deinum die Konfigurations-bean für JSF und entfernen der WebMvcConfigurerAdapter definition (bezogen auf Spring MVC), Spring Boot scheint zuordnen-Anforderungen an das FacesServlet Instanz, jetzt bekomme ich die folgende Fehlermeldung:
HTTP Status 500 - Servlet.init() for servlet FacesServlet threw exception
Ursache:
java.lang.IllegalStateException: Could not find backup for factory javax.faces.context.FacesContextFactory
Den code für die neue JsfConfig bean:
package com.hello;
import com.sun.faces.config.ConfigureListener;
import org.springframework.boot.context.embedded.ServletListenerRegistrationBean;
import org.springframework.boot.context.embedded.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import javax.faces.webapp.FacesServlet;
@Configuration
public class JsfConfig {
@Bean
public FacesServlet facesServlet() {
return new FacesServlet();
}
@Bean
public ServletRegistrationBean facesServletRegistration() {
ServletRegistrationBean registration = new ServletRegistrationBean(facesServlet(), "*.xhtml");
registration.setName("FacesServlet");
return registration;
}
@Bean
public ServletListenerRegistrationBean<ConfigureListener> jsfConfigureListener() {
return new ServletListenerRegistrationBean<ConfigureListener>(new ConfigureListener());
}
@Bean
public ViewResolver getViewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/templates/");
resolver.setSuffix(".xhtml");
return resolver;
}
}
- Wo ist dein view.html Datei? Vielleicht ist es nicht die Feststellung, dass die Datei? Haben Sie versucht, ändern die Datei-und view-Namen, um etwas anderes, sagen
index
? - Ich machte Kopien von der Datei und versucht die Namensgebung index.htm in der
main
,main/resources
undmain/resources/templates
(Standard für Thymeleaf) die Verzeichnisse, wenn das der Fall ist, ich könnte fehlt eine gewisse Konfiguration.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwendung von JSF, die nicht gehen, um die Arbeit mit Spring MVC beide sind unterschiedliche Technologien. Sie müssen setup JSF richtig. Für diese müssen Sie einen
FacesServlet
und die GesichterConfigureListener
.Dies ist erforderlich, um setup-JSF richtig, in der Regel dieConfigureListener
würde automatisch erkannt werden, aber die embedded-Versionen, die nicht wirklich scheinen es zu tun.Etwas wie dieses. Ich würde wahrscheinlich empfehlen, dass Sie deaktivieren Sie die auto-config für das DispatcherServlet etc. wie Sie mit Hilfe von JSF und nicht Spring MVC.
java.lang.IllegalStateException: Could not find backup for factory javax.faces.context.FacesContextFactory
. Antworten zu anderen Fragen, die mit diesem neuen Fehler mehr oder weniger zuordnen, es mit mehreren JSF-Implementierungen im Klassenpfad. Entfernen von meiner JSF-Artefakte hat nicht funktioniert, und ich nichtNachdem ich diese Frage von louvelg über ein anderes problem nach einrichten des FacesServlet mit Spring Boot, ich habe es die Arbeit mit JSF/primefaces durch die Zugabe von ein paar Konfigurations-Dateien und auch eine ServletRegistrationBean von spring-web. Die web.xml und faces-config.xml Dateien, die Art der Verletzung Spring-Boot-Idee, minimal eingerichtet, ohne Tonnen von xml-Dateien, aber dies ist ein minimal-set-up konnte ich finden, mit JSF, wenn jemand weiß, einen besseren/saubereren Weg, dies zu tun, lassen Sie es mich bitte wissen.
Hier sind die Abhängigkeiten in meinem gradle.build-Datei:
wo
tomcatVersion
ist "7.0.34". Die wichtigsten änderungen sind dabei:spring-boot-starter-web
", zu dem auch Spring MVC wie bereits von M. Deinumspring-boot-starter
(einfacher Start) undspring-web
spring-boot-starter-web
ist nicht mehr hier.Hier sind die neuen Inhalte meiner main-Klasse:
@EnableAutoConfiguration
wenn Sie möchten, Spring Boot, automatisch Tomcat, und die ServletRegistrationBean mapping xhtml-Anforderungen an Ihre FacesServlet.Den WEB-INF/faces-config.xml die Datei in meinem webapp-Verzeichnis:
und die web.xml Datei auch in webapp/WEB-INF:
Den servlet-Definitionen scheinen überflüssig, aber für einige Grund, wenn ich entfernen Sie Sie entweder aus dem web.xml die Datei oder der servlet-Registrierung bean, das Rendern von xhtml-Seiten nicht wie erwartet oder überhaupt nicht. EDIT: stellt sich heraus, das servlet-mapping nicht notwendig ist, in der web.xml Datei, es war nur ein IDE-problem, in meinem Fall Intellij Idea weiß nicht, über das servlet-mapping definiert wird in der servlet-Registrierung bean, so war es zu Klagen über fehlende Zuordnungen für die zu erwartenden servlet, aber die Anwendung läuft ohne Probleme trotzdem.
Danke an alle, die dazu beigetragen haben.
Folgte ich diesem post und ich war immer die gleichen Fehler. Das ist ein bisschen ein hack, aber es ist derzeit das beste, was ich kann.
Fügen Sie diese zu Ihrem src/main/webapp/WEB-INF-Ordner in einem web.xml Datei
Diese beheben soll, kann nicht finden backup-factory Problem.
Rannte ich weiter Probleme, nachdem ich diese Fehlermeldung bekommen
Also ich habe diese Abhängigkeit
Und dies ist, wenn Dinge begann, für mich zu arbeiten.
Ich bin noch auf Arbeit, es so zu machen, dass web.xml ist nicht erforderlich. Weil es ist wirklich ist eine Art ein hack für, wie Spring Boot funktionieren soll. Weitere Fortschritte, die ich machen, auf diese ich werde versuchen zu erinnern, zu post zurück nach dieser Antwort, aber wenn ich nicht will ich hinzufügen, zu dieser Beispiel-app, die ich erstellt.
https://github.com/Zergleb/Spring-Boot-JSF-Example
Ich auch stieß in das gleiche problem. Ich fand eine andere Lösung, ohne [@EnableAutoConfiguration]:
[pom.xml]
- und die Java-config-Klasse :
[WEB-INF/web.xml]
[faces-config.xml]
Diese Zeile im code ist die Registrierung ein controller, bei Empfang einer Anforderung für
/view
wird redirect auf eine view mit logischen Namenview
.Der view-resolver wird dann nehmen Sie die logischen Namen sind, gelten ein Präfix und ein suffix ein und finden Sie die definition der Sicht, wie
view.xhtml
.Das problem hier scheint zu sein, dass die default-view-resolver Hinzugefügt wird, wodurch kein suffix oder Präfix.
Sehen
WebMvcAutoConfiguration.defaultViewResolver()
für den code, wo die Standard-view-resolver definiert ist.Den Standard-view-resolver versucht, laden Sie eine Ansicht mit dem Namen
/view
auslöst, wieder den gleichen controller, erstellen Sie eine Schleife.Entweder versuchen, zu kommentieren, dass
addViewController
Linie oder definieren Sie Ihre eigene Sicht auf resolver, zum Beispiel auf diese Weise:java.lang.IllegalStateException: Could not find backup for factory javax.faces.context.FacesContextFactory
(nach darunter M. Deinum ist JSF-bean-Konfiguration, die jetzt Karten xhtml-Dateien, um die Gesichter servlet).