JSF注释不适用于Spring-boot

时间:2014-07-10 08:21:17

标签: spring jsf spring-boot

我曾尝试使用Spring Boot and JSF/Primefaces/Richfaces中的信息,但对我来说它不起作用。

我使用 Java 8,maven,Spring-boot和JSF与PrimeFaces。 我想有可执行jar并通过main方法或命令行java -jar myApp.jar运行我的应用程序。

问题 - 忽略JSF注释(@ManagedBean@ManagedProperty)。

Pom文件:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.3.RELEASE</version>
</parent>

<dependencies>
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>7.0.54</version>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-logging-juli</artifactId>
        <version>7.0.54</version>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>7.0.54</version>
    </dependency>

    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>5.0</version>
    </dependency>

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.2.7</version>
    </dependency>

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.7</version>
    </dependency>
    ...
</dependencies>

我也尝试添加/删除javax.el-api / javax.el / jstl - 结果相同。对于bean初始化,我已将部分添加到faces-config.xml

当我将 spring-boot-starter-web 更改为 spring-boot-starter 并拥有 spring-web 时(根据解决方案来自来自Herick的帖子)我得到了

  

java.io.FileNotFoundException:类路径资源   [组织/ springframework的/网络/ servlet的/配置/注解/ WebMvcConfigurerAdapter.class]   因为它不存在而无法打开

我的配置类:

@Configuration
@EnableAutoConfiguration//(exclude = {WebMvcAutoConfiguration.class, DispatcherServletAutoConfiguration.class})
@ComponentScan("hello")
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class);
    }

    @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());
      }

}

使用(exclude = {WebMvcAutoConfiguration.class, DispatcherServletAutoConfiguration.class})web.xml配置不起作用。 在上述帖子中:

@Bean
public ListenerRegistationBean jsfConfigureListener() {
    return new ListenerRegistrationBean(new ConfigureListener());           
}     
我的春季靴子中缺少

ListenerRegistationBean而我使用了ServletListenerRegistrationBean

我的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"       
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"     
    version="3.1">
    <display-name>Test</display-name>
    <servlet>
        <servlet-name>facesServlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>facesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
    <error-page>
        <location>/error.xhtml</location>
    </error-page>
</web-app>

和faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"              
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"  
    version="2.2">
    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>

    <managed-bean>
      <managed-bean-name>managedBeann</managed-bean-name>
      <managed-bean-class>hello.ManagedBeann</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
</faces-config>

因为使用了非工作注释。 顺便说一句,PrimeFaces正在工作。

我的目的是强制使用JSF-annotation,因为在没有它们的真实项目中它是不可能的。

1 个答案:

答案 0 :(得分:6)

声明

即使我的答案与问题标题不符,我也会根据我认为您试图实现的内容来回答这个问题。

你说“我的目的是强制JSF注释工作,因为在没有它们的真实项目中它是不可能的。”我猜你的意思是“不可能”,因为在fa​​ces-config.xml中放置托管bean是很麻烦的。所以为此我不打算使用faces-config.xml来管理bean。

我将向您展示一个使用Spring注释的替代方案,这非常麻烦,我觉得可以实现您的原始目标。

答案

示例 - https://github.com/Zergleb/Spring-Boot-JSF-Example

我前几天查看了你的问题并决定尝试完成这项工作,并将我的结果放在github上(上面的链接)。这个例子应该允许你使用Spring注释而不是JSF注释来编写JSF应用程序,例如你会说

@Component
@Scope("view")
//The example above contains an implementation of the View Scope in Spring.

而不是

@ManagedBean
@ViewScope

然后您就可以使用Spring进行所有依赖注入。

我使用gradle而不是maven,这意味着你的依赖项在build.gradle而不是pom.xml中我必须添加这些才能使一切正常。那些应该很容易转换成我想象的pom.xml。

compile group: 'javax.el', name: 'el-api', version: '1.0'
compile group: 'com.sun.el', name: 'el-ri', version: '1.0'
compile group: "javax.servlet.jsp" name: "jsp-api" version: "2.1"

我的web.xml现在只有一个servlet,我删除了servlet-mapping和web.xml的所有其他属性

(我还在研究如何删除这个web.xml,检查示例是否有任何关于我是否想出来的更新)

<web-app ... same as before>
    <servlet>
        <servlet-name>facesServlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>
</web-app>

faces-config.xml现在没有托管bean

<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"  version="2.2">
     <application>
         <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
     </application>
</faces-config>

我现在没有这个,但是我们可能想要考虑在web.xml中有一个空的我没有研究过这个,但是github上的一个spring-project示例包含这个代码

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-traditional/src/main/webapp/WEB-INF/web.xml

<!-- Disables Servlet Container welcome file handling. Needed for compatibility with Servlet 3.0 and Tomcat 7.0 -->
<welcome-file-list>
    <welcome-file></welcome-file>
</welcome-file-list>

我希望能回答你的问题。如果我遗漏了一些东西,请尝试并参考示例代码。

实施例

https://github.com/Zergleb/Spring-Boot-JSF-Example

运行一个Spring Boot应用程序,该应用程序应该在一个共享公共上下文的应用程序中运行Spring MVC和JSF。(我在答案中包含了这个,因为你在问题Spring Boot and JSF/Primefaces/Richfaces中引用了这个链接,它说混合了Spring MVC和JSF是不可能的,但我在我的示例代码中工作。