JSF 注释不适用于 Spring-boot

Posted

技术标签:

【中文标题】JSF 注释不适用于 Spring-boot【英文标题】:JSF annotations don't work with Spring-boot 【发布时间】:2014-08-31 12:54:50 【问题描述】:

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

我使用 Java 8、maven、Spring-boot 和带有 PrimeFaces 的 JSF。 我想拥有可执行的 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 (根据解决方案来自提到赫里克的帖子)我得到了

java.io.FileNotFoundException:类路径资源 [org/springframework/web/servlet/config/annotation/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 在我的 spring-boot 中不存在,我使用 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 注释工作,因为在没有它们的实际项目中这是不可能的。

【问题讨论】:

你的 web.xml 没有做任何事情,所以从删除它开始。您不应该将 FacesServlet 作为 bean,因为您已经拥有 facesServletRegistration。 servlet 的名称应为 FacesServlet,因为它由 ConfigureListener 查找 谢谢!我希望,我理解你正确。关于 web.xml:我想在里面有 javax.faces.application.ViewExpiredException,文件上传过滤器,primefaces 主题配置。我不知道这个设置的另一个地方,如果 web.xml 将被删除。 关于 FacesServlet。我这样做: // '@Bean' public FacesServlet facesServlet() return new FacesServlet(); @Bean public ServletRegistrationBean facesServletRegistration() ServletRegistrationBean 注册 = new ServletRegistrationBean(facesServlet(), "*.xhtml"); registration.setName("FacesServlet");退货登记; 但没有任何改变。 Spring boot 对 web.xml 没有任何作用,这可能是 JSF 的东西解析了 web.xml 本身。对于 Spring Boot,它根本不存在。 你有没有办法解决它?我正在尝试创建相同的内容并遇到@ManagedBean 的问题。它没有初始化 bean 【参考方案1】:

免责声明

即使我的回答与问题标题不匹配,我也会根据我认为您试图达到的目标来回答这个问题。

您说“我的目的是强制 JSF 注释工作,因为在没有它们的实际项目中这是不可能的。”我猜你的意思是“不可能”,因为将托管 bean 放在 faces-config.xml 中很麻烦。所以为此我不会使用 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是不可能的,但我已经在我的示例代码中工作了。

【讨论】:

感谢您的接近。也许我会在我的下一个项目中使用这个,但是当前需要与 JSF Managed beans 交互。

以上是关于JSF 注释不适用于 Spring-boot的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Java EE 7 JSF 示例不适用于 Tomcat

JSF 2.2 h:inputFile 不适用于漂亮的面孔[重复]

会话到期时的授权重定向不适用于提交 JSF 表单,页面保持不变

JSF 2.2 - 文件上传不适用于 Ajax。表单的编码类型似乎不正确(仅通过 AJAX)

集群环境中的故障​​转移不适用于 JSF 2、Richfaces 4、Tomcat 7

JSF 2.2 webapp适用于本地计算机,但不适用于服务器