簡単な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>
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アノテーションとはまったく関係がありません。また、混同してはいけません。
私は半日もそのような問題に悩まされてきました。私の場合の問題は、EclipseからWebAppを実行した場合にのみ発生します。 JSF 2はWEB-INF/classesで注釈付きBeanを探しても見つかりません。これを解決するために、ビルド出力パスをWebContent/WEB-INF/classesに変更しました。同様のケースの詳細な説明は次のとおりです。 Jetty mavenの目標jetty:runはJSF 2.0 @ManagedBeanでは機能しません
OPとまったく同じシナリオ(Eclipseで、run-> run on serverを使用してGlassfish 3サーバーに公開する)で、Eclipseプロジェクト名からスペースを削除するまで、まったく同じエラーが発生します。スペースを削除するだけで問題は解決しました。
私は同じ問題を抱えていました、私はすべてを試しました。その後、「Click and Build Project」ボタン、「Build Project」ボタンをクリックしてGlassFishサーバーを再起動しました。その後、それは私にとっては今のところ機能します:)
Warファイルをチェックして、クラスがWEB-INF/classesフォルダーにあるかどうかを確認してください。私は同じ問題に遭遇し、クラスファイルWEB-INF/classesフォルダーがないことがわかりました。