web-dev-qa-db-ja.com

Java EE 6:ターゲット到達不能、識別子「helloBean」がnullに解決されました

簡単なJSF 2チュートリアルの例を機能させるようにしています。

私はEclipseで動的Webプロジェクトを使用して、Glassfish 3サーバーに公開しています(実行->サーバーで実行)。最初のindex.xhtmlページは正しくロードされますが、マネージドBeanにアクセスする必要がある場合、次のエラーが表示されます。

/index.xhtml @14,48 value="#{helloBean.name}": Target Unreachable, identifier 'helloBean' resolved to null

私はこのトピックに関する他のさまざまな議論を見てきましたが、解決策は私にはうまくいかないようです(たとえば、beans.xmlの追加、マネージドBeanに名前を付けるなど、命名規則に従います)。

任意の助けいただければ幸いです。

これが私が現在扱っているコードです:

Index.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://Java.Sun.com/jsf/core"      
      xmlns:h="http://Java.Sun.com/jsf/html">

    <h:head>
        <title>JSF 2.0 Hello World</title>
    </h:head>
    <h:body>
        <h3>JSF 2.0 Hello World Example - hello.xhtml</h3>
        <h:form>
           <h:inputText value="#{helloBean.name}"></h:inputText>
           <h:commandButton value="Welcome Me" action="response"></h:commandButton>
        </h:form>
    </h:body>
</html>

response.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"    
      xmlns:h="http://Java.Sun.com/jsf/html">

    <h:head>
        <title>JSF 2.0 Hello World</title>
    </h:head>
    <h:body bgcolor="white">
        <h3>JSF 2.0 Hello World Example - welcome.xhtml</h3>
        <h4>Welcome #{helloBean.name}</h4>
    </h:body>
</html>

管理対象Bean:

package Java.hello1;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import Java.io.Serializable;


@ManagedBean
@SessionScoped
public class HelloBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private String name = "Ricardo";

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://Java.Sun.com/xml/ns/javaee" 
    xmlns:web="http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee 
    http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5">

  <display-name>JavaServerFaces</display-name>

  <!-- Change to "Production" when you are ready to deploy -->
  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>

  <!-- Welcome page -->
  <welcome-file-list>
    <welcome-file>faces/index.xhtml</welcome-file>
  </welcome-file-list>

  <!-- JSF mapping -->
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!-- Map these files with JSF -->
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>

</web-app>
17
Lou Rous

JSFに注釈を解釈させるには、JSF 2.0準拠の/WEB-INF/faces-config.xmlファイルが必要です。

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://Java.Sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

    <!-- Config here. Can even be kept empty. -->

</faces-config>

すでに持っている場合、またはそれでも問題が解決しない場合は、警告/エラーが表示されない場合は、サーバーの起動ログに注意してください。

ところで、あなたの/WEB-INF/web.xmlファイルはServlet 2.5仕様に準拠していると宣言されています。これは必ずしも害を及ぼすとは限りませんが、Servlet 3.0準拠のコンテナを使用している場合は意味がありません。ルート宣言を次のように更新します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://Java.Sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0">

    <!-- Config here. -->

</web-app>

/WEB-INF/beans.xmlは、@Named@InjectなどのCDIアノテーションを対象としています。完全に空のファイルで十分です。 @ManagedBean@ManagedPropertyなどのJSFアノテーションとはまったく関係がありません。また、混同してはいけません。

14
BalusC

私は半日もそのような問題に悩まされてきました。私の場合の問題は、EclipseからWebAppを実行した場合にのみ発生します。 JSF 2はWEB-INF/classesで注釈付きBeanを探しても見つかりません。これを解決するために、ビルド出力パスをWebContent/WEB-INF/classesに変更しました。同様のケースの詳細な説明は次のとおりです。 Jetty mavenの目標jetty:runはJSF 2.0 @ManagedBeanでは機能しません

10
alehro

OPとまったく同じシナリオ(Eclipseで、run-> run on serverを使用してGlassfish 3サーバーに公開する)で、Eclipseプロジェクト名からスペースを削除するまで、まったく同じエラーが発生します。スペースを削除するだけで問題は解決しました。

1
Forge_7

私は同じ問題を抱えていました、私はすべてを試しました。その後、「Click and Build Project」ボタン、「Build Project」ボタンをクリックしてGlassFishサーバーを再起動しました。その後、それは私にとっては今のところ機能します:)

1
umitkilic

Warファイルをチェックして、クラスがWEB-INF/classesフォルダーにあるかどうかを確認してください。私は同じ問題に遭遇し、クラスファイルWEB-INF/classesフォルダーがないことがわかりました。

0
sendon1982