【问题标题】:JSF not see annotated BeanJSF 看不到带注释的 Bean
【发布时间】:2013-01-25 16:54:09
【问题描述】:

我尝试制作简单的 JSF 示例并有几个文件管理器。我使用 Maven,并已存储在 META-INF flolder faces-confid.xml 中。

尝试执行时在输出中看到:

Welcome to JSF. 

但它必须是:

Welcome to JSF. test

他们在这里:

豆文件

import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;


@Named("test")
@RequestScoped
public class TestBean implements Serializable{
    private String test = "test";

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }    
}

XHTML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Welcome</title>
    </h:head>
    <h:body>
        <h3>Welcome to JSF. #{test.test}</h3>
    </h:body>
</html>

【问题讨论】:

  • JSF not see my annotated Bean 的可能重复项
  • @Ravi:不完全是。在最初的问题中,#{test.test} 看起来很普通。在当前问题中,它显示为一个空字符串。

标签: java jsf-2 annotations


【解决方案1】:

在 Java EE / JSF Web 应用程序中,基本上有 2 个 API 可用于管理您的 bean。

那些,就像你最初的问题一样,

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named("test")
@RequestScoped

来自CDI(上下文和依赖注入),这是一种 Java EE 标准化管理 bean 的方式(旨在标准化/替代 Spring DI 和 AOP 等)。这仅适用于支持 Java EE Web 配置文件的容器,例如 Glassfish、JBoss AS 等,但不适用于准系统 servlet 容器,例如 Tomcat 和 Jetty(您 can 但是单独安装它;注意,Weld 是 CDI 的参考实现,就像 Mojarra 是 JSF 的参考实现一样)。

为了让 CDI 运行,你需要在你的 webapp 中有一个物理的/WEB-INF/beans.xml 文件。文件本身可以保持为空。您最初的问题表明您没有。当此文件不存在时,将不会为 webapp 初始化 CDI,从而加快服务器启动时间。

另一种方式,正如您在自己的答案中所想的那样,

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean("test")
@RequestScoped

来自JSF 本身。如果您打算让您的 Web 应用程序在各种容器(包括准系统 JSP/Servlet 容器,如 Tomcat 和 Jetty)之间保持可移植性,这将特别有用。它们不需要任何额外的配置文件即可运行。

需要注意的是,eager=true 在请求范围的 bean 上是不必要的。更重要的是,无论如何它都会被忽略。它仅在应用程序范围的 bean 上被接受。另见例如How can I initialize a Java FacesServlet.

【讨论】:

  • 我将项目中的依赖项从 jsf 2.2.x 更改为 jsf 2.1.0,现在它不再工作了,我可以理解原因。
  • 重新启动我的笔记本电脑,它又可以工作了,我什么都听不懂。
  • 它显然没有正确构建或部署。这是一个工具问题,而不是 JSF 问题。
【解决方案2】:

通过使用其他注释修复

@ManagedBean(name = "test", eager = true)
@RequestScoped

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 2011-04-12
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多