サーブレットマッピングは未知のサーブレット名 XXX を指定しています

前回に引き続きトラブルシューティングのボツ記事を。

    • -

○web.xmlの解析エラーその1

設定ファイルのエラーは、比較的エラーメッセージから解決しやすいですが、ちょっと難しいものもあります。

2007-07-24 17:37:42,341 ERROR [org.apache.catalina.startup.ContextConfig] アプリケーションのweb.xml中の解析エラーです
java.lang.IllegalArgumentException: サーブレットマッピングは未知のサーブレット名 Seam Resource Servlet を指定しています
	at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2726)
	at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2752)
	at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1061)
	at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562)
	at org.apache.catalina.startup.ContextConfig.applicationWebConfig(ContextConfig.java:369)
	at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1062)
== 省略 ==
	at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.run(AbstractDeploymentScanner.java:225)
2007-07-24 17:37:42,559 ERROR [org.apache.catalina.startup.ContextConfig] 25行の23列目で発生しました
2007-07-24 17:37:42,575 ERROR [org.apache.catalina.startup.ContextConfig] 前のエラーのためにこのアプリケーションは利用できないようにマークします
2007-07-24 17:37:42,575 ERROR [org.apache.catalina.core.StandardContext] Error getConfigured
2007-07-24 17:37:42,575 ERROR [org.apache.catalina.core.StandardContext] 以前のエラーのためにコンテキストの起動が失敗しました [/seam-booking]

このエラーメッセージなら、問題の行も判明しているためweb.xmlをチェックします。

    <servlet-mapping>
        <servlet-name>Seam Resource Servlet</servlet-name>
        <url-pattern>/seam/resource/*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Seam Resource Servlet</servlet-name>
        <servlet-class>org.jboss.seam.servlet.ResourceServlet</servlet-class>
    </servlet>

通常ならtypoを疑うところですが、今回は正常に設定されているようです。さて・・・?

実はこれ、より先に登場するため、「未知のサーブレットSeam Resource Servlet」と判断されてしまっています。ありがちですが、はまると気付きにくいですね。この順番を入れ替えればエラーは回避できます。
Servlet2.3以前ではDTDでこの順番は規定されていました。しかし、Servlet2.4以降ではweb.xmlDTDではなくXML Schemaによって定義されるようになっており、の順番はスキーマ上は自由です。JBoss(Tomcat6)の実装が対応していないだけで、将来はこの記述でもデプロイエラーにならないかもしれません*1

      • -

あんまりJBossに関係ないのでボツっと。スキーマのバリデーションエラーになればちょっとかっこいいんですけどね。

*1:あるいはスキーマが順番を規定するかも