Eclipse を介して非常に単純な JSF アプリケーションを実行しようとすると、JBoss ログに奇妙なエラーが記録されます。そこで、JSF の例で何か基本的なことを見逃していないかどうかを尋ねる簡単なシナリオを作成しました。または、特定のツールまたは環境に構成ミスまたはバグがある可能性があります。
非常に単純な JSF アプリを作成しました。これは、ManagedBean を介して名前を収集し、2 番目の JSF html ページ (ok.jsp) に遷移する 1 つの JSF html ページ (hello.jsp) です。Bean には、1 つの getter、1 つの setter、および 1 つのアクション メソッド (addContact) があります。
注釈は使用していません。1 つの ManagedBean エントリと 1 つのナビゲーション ルールを含む単純な faces-config.xml ファイルだけです。Bean の名前は「contact」で、クラスは「com.mbeans.ContactBean」です。マッピングはすべて正しいと思います。
Eclipse Juno SR2 経由で JBoss 7.1 を使用しています。JSF 2.0 アプリです。Juno 用の最新の JBoss Tools 4.0 をロードしました。
アプリは次のファイルのみで構成されています。
web.xml
faces-config.xml
ContactBean.java
hello.jsp
ok.jsp
ファイルの内容は以下です。しかし、それらが Eclipse を介してどのように作成されたかについて、いくつかのカラー コメントを追加します (読み飛ばしたり無視したりすることをお勧めします)。
Eclipse に入り、新しいプロジェクトを作成します。次の設定で「動的 Web プロジェクト」を選択します。
ターゲット ランタイム = JBoss 7.1 ランタイム
構成 = JBoss 7.1 ランタイムの動的構成
web.xml = CHECKED を生成します
WebContent を右クリックし、新しい JSP ファイル (ファイル名 = hello.jsp) を作成します。JSP テンプレート = New JSF Page (html) を使用します。
「contact」という名前の ManagedBean にアクセスする単純なフォームを表す行をいくつか追加して、hello.jsp が次のようになるようにします。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Add Contact</title>
</head>
<body>
<f:view>
<h2>Add Contact</h2>
<h:form>
Name:<br>
<h:inputText value="#{contact.name}" />
<h:commandButton value="Add Contact"
action="#{contact.addContact}" type="submit" />
</h:form>
</f:view>
</body>
</html>
同様に、次の JSP ファイル (ok.jsp) を追加します。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OK - Added New Contact</title>
</head>
<body>
<f:view>
<p>
The address for
<h:outputText value="#{contact.name}" />
was successfully added.
</p>
</f:view>
</body>
</html>
プロジェクト (JSFTest) を右クリックし、次の設定でクラスを追加します。
パッケージ = com.mbeans
名前 = ContactBean
クラスを次のように編集します。
package com.mbeans;
public class ContactBean {
public ContactBean() {super();}
String name;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String addContact() {
System.out.println("Name: " + getName());
return "success";
}
}
次に、WEB-INF フォルダーを右クリックNew->Other->JBoss Tools Web->JSF->Faces Config
し、次の設定で選択しました。
フォルダ:* = /JSFTest
名前:* = 顔構成
バージョン: 2.0
web.xml に登録 = CHECKED
作成された新しい faces-config.xml で、右クリックManaged Beans->New->Managed Bean...
して次のように設定します。
スコープ = アプリケーション
クラス:* = com.mbeans.ContactBean
名前:* = contactBean
次に、右クリックNavigation Rules->New->Rule ...
してダイアログ ボックスを空白のままにし、[.] をクリックしFinish
ました。
右クリック"[any]"->New->Case...
して次のように設定しました。
結果から: = 成功
アクションから: = #{contact.addContact}
ToView ID:* = /ok.jsp
これにより、最終的に、次の faces-config.xml ファイルが WEB-INF フォルダーに生成されます。
<?xml version="1.0"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
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">
<managed-bean>
<managed-bean-name>contact</managed-bean-name>
<managed-bean-class>com.mbeans.ContactBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
<navigation-rule>
<navigation-case>
<from-action>#{contact.addContact}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/ok.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
次に、hello.jsp を右クリックして、Run As->Run On Server
JBoss 7.1 Runtime Server を選択しました (これが唯一のサーバーです)。サーバーが正常に起動します。(私は、この JBoss サーバーが Eclipse の外部で他のものを正しく実行していることを知っています。)
500 エラーが発生します。具体的には、ログに次のメッセージが表示されます。これが問題の原因だと思います。
23:33:08,612 ERROR [org.jboss.web] (MSC service thread 1-3) JBAS018211: Could not load JSF managed bean class: com.mbeans.ContactBean
NullPointerException は、上記のエラー メッセージとは関係なく、私が間違っていた何かが原因である可能性があると思います。私は上記のエラーについて最も心配しています。しかし、誰かがこの NullPointerException をクリアする私の間違いを指摘できる場合は、それを排除できるように感謝します。以前は、NPE なしで別の 500 エラーが発生しましたが、まだログに JBAS018211 がありました。つまり、NPE は煩わしいが無関係だと思います。
完全なログは次のとおりです。
23:33:06,543 INFO [org.jboss.modules] JBoss Modules version 1.1.1.GA
23:33:06,761 INFO [org.jboss.msc] JBoss MSC version 1.0.2.GA
23:33:06,824 INFO [org.jboss.as] JBAS015899: JBoss AS 7.1.1.Final "Brontes" starting
23:33:07,636 INFO [org.xnio] XNIO Version 3.0.3.GA
23:33:07,638 INFO [org.jboss.as.server] JBAS015888: Creating http management service using socket-binding (management-http)
23:33:07,647 INFO [org.xnio.nio] XNIO NIO Implementation Version 3.0.3.GA
23:33:07,655 INFO [org.jboss.remoting] JBoss Remoting version 3.2.3.GA
23:33:07,678 INFO [org.jboss.as.logging] JBAS011502: Removing bootstrap log handlers
23:33:07,686 INFO [org.jboss.as.configadmin] (ServerService Thread Pool -- 26) JBAS016200: Activating ConfigAdmin Subsystem
23:33:07,689 INFO [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 31) JBAS010280: Activating Infinispan subsystem.
23:33:07,717 INFO [org.jboss.as.security] (ServerService Thread Pool -- 44) JBAS013101: Activating Security Subsystem
23:33:07,725 INFO [org.jboss.as.naming] (ServerService Thread Pool -- 38) JBAS011800: Activating Naming Subsystem
23:33:07,749 INFO [org.jboss.as.security] (MSC service thread 1-10) JBAS013100: Current PicketBox version=4.0.7.Final
23:33:07,749 INFO [org.jboss.as.webservices] (ServerService Thread Pool -- 48) JBAS015537: Activating WebServices Extension
23:33:07,752 INFO [org.jboss.as.osgi] (ServerService Thread Pool -- 39) JBAS011940: Activating OSGi Subsystem
23:33:07,789 INFO [org.jboss.as.connector] (MSC service thread 1-7) JBAS010408: Starting JCA Subsystem (JBoss IronJacamar 1.0.9.Final)
23:33:07,797 INFO [org.jboss.as.naming] (MSC service thread 1-4) JBAS011802: Starting Naming Service
23:33:07,825 INFO [org.jboss.as.mail.extension] (MSC service thread 1-12) JBAS015400: Bound mail session [java:jboss/mail/Default]
23:33:07,844 INFO [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 27) JBAS010403: Deploying JDBC-compliant driver class org.h2.Driver (version 1.3)
23:33:07,971 INFO [org.jboss.ws.common.management.AbstractServerConfig] (MSC service thread 1-7) JBoss Web Services - Stack CXF Server 4.0.2.GA
23:33:07,982 INFO [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-5) Starting Coyote HTTP/1.1 on http--127.0.0.1-7070
23:33:08,341 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-1) JBAS010400: Bound data source [java:jboss/datasources/ExampleDS]
23:33:08,352 INFO [org.jboss.as.server.deployment.scanner] (MSC service thread 1-4) JBAS015012: Started FileSystemDeploymentService for directory /usr/local/jboss-as-7.1.1.Final/standalone/deployments
23:33:08,358 INFO [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) JBAS015003: Found JSFTest.war in deployment directory. To trigger deployment create a file called JSFTest.war.dodeploy
23:33:08,360 INFO [org.jboss.as.remoting] (MSC service thread 1-10) JBAS017100: Listening on /127.0.0.1:9999
23:33:08,362 INFO [org.jboss.as.remoting] (MSC service thread 1-3) JBAS017100: Listening on /127.0.0.1:4447
23:33:08,475 INFO [org.jboss.as.server.deployment] (MSC service thread 1-12) JBAS015876: Starting deployment of "JSFTest.war"
23:33:08,612 ERROR [org.jboss.web] (MSC service thread 1-3) JBAS018211: Could not load JSF managed bean class: com.mbeans.ContactBean
23:33:08,792 INFO [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-10) Initializing Mojarra 2.1.7-jbossorg-1 (20120227-1401) for context '/JSFTest'
23:33:09,663 INFO [org.hibernate.validator.util.Version] (MSC service thread 1-10) Hibernate Validator 4.2.0.Final
23:33:09,805 INFO [org.jboss.web] (MSC service thread 1-10) JBAS018210: Registering web context: /JSFTest
23:33:09,818 INFO [org.jboss.as] (MSC service thread 1-2) JBAS015951: Admin console listening on http://127.0.0.1:9990
23:33:09,819 INFO [org.jboss.as] (MSC service thread 1-2) JBAS015874: JBoss AS 7.1.1.Final "Brontes" started in 3541ms - Started 172 of 249 services (76 services are passive or on-demand)
23:33:09,873 INFO [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "JSFTest.war"
23:33:29,683 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/JSFTest].[jsp]] (http--127.0.0.1-7070-1) Servlet.service() for servlet jsp threw exception: java.lang.NullPointerException
at javax.faces.webapp.UIComponentClassicTagBase.setJspId(UIComponentClassicTagBase.java:1858) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.apache.jsp.hello_jsp._jspx_meth_f_005fview_005f0(hello_jsp.java:103)
at org.apache.jsp.hello_jsp._jspService(hello_jsp.java:78)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) [jbossweb-7.0.13.Final.jar:]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) [jbossweb-7.0.13.Final.jar:]
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) [jbossweb-7.0.13.Final.jar:]
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253) [jbossweb-7.0.13.Final.jar:]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_17]
それでおしまい。それが問題です。
(余談ですが、Eclipse は JSF のホバー オーバー タグの説明も表示しません。HTML タグは問題ありません。これは、JBoss Tools のより深い設定ミスがあるのではないかと思います。)
私の問題を見直してくれてありがとう。