読者です 読者をやめる 読者になる 読者になる

yohjizzz's Blog

I'm a Programmer.

WebLogic での Teeda 。

以下↓の環境で、

java : 1.5.0_12
weblogic : 9.2
container : 2.4.18-rc4 (s2-framework, s2-extension, s2-tiger)
dao : 1.0.47-RC1 (s2dao, s2-dao-tiger)
teeda : 1.0.11-SP3 (teeda-core, teeda-extension, teeda-tiger, teeda-ajax)
xerces : 2.6.2 (xercesImpl, xmlParserAPIs)

Teeda の html へアクセスすると、

java.lang.NoSuchMethodError:
 org.apache.xerces.parsers.SAXParser.<init>(Lorg/apache/xerces/xni/parser/XMLParserConfiguration;)V
         at org.seasar.teeda.extension.html.impl.TeedaSAXParser.<init>(TeedaSAXParser.java:26)
         at org.seasar.teeda.extension.html.impl.HtmlParserImpl.parse(HtmlParserImpl.java:50)

こー↑なる><
xerces が 2.6.2 では起こりえないので、ランタイムのクラスパスにヴァージョンの異なる SaxParser が含まれているのでしょう。


...と思いつつも未解決状態で、飲みを優先してしまった自分は技術者失格かもしれません...
明日、解決します。すいません><

追記

解決しましたので備忘録の為に載せておきます。

原因

WebLogic (9.2) のデフォルトの「xercesImpl」と、
Teeda (1.0.11-SP3) に必要な「xercesImpl-2.6.2.jar」のヴァージョンの差異。

TeedaSAXParser(extends SAXParser)のコンストラクタの中で、
呼び出しているスーパークラス(SAXParser)のコンストラクタが、、
「xercesImpl-2.6.2.jar」に含まれるけど、、WebLogic の xercesImpl に含まれる SAXParser には存在しない><
そこで「NoSuchMethodError」…

対応策

とりあえず当環境にて Teeda のアプリを動作させる為だけであれば以下で ok 。

対象アプリの WEB-INF/weblogic.xml にて、

<wls:weblogic-web-app
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:wls="http://www.bea.com/ns/weblogic/90"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">
 ・
 ・
 ・
  <wls:container-descriptor>
    <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
  </wls:container-descriptor>
</wls:weblogic-web-app>

http://edocs.beasys.co.jp/e-docs/wls/docs92/programming/classloading.html#wp1073478

ただ注意しないといけないのは、この↑ページにもある通り、

この機能(prefer-web-inf-classes)を使用する場合は、
Web アプリケーションのクラス定義から作成されたインスタンスと、
サーバの定義から作成されたインスタンスを混在させないように注意してください。
これらのインスタンスが混在していると、ClassCastException が発生します。

これ↑はまぁ当然と言えば当然なんだけど、
この為に WebLogic 9.2 上で動作する1つのアプリ(WAR)に Teeda と JSR 181(@WebService、@WebMethod)は混在させられないっぽい。
Webサービスをコールすると ClassCastException が発生してしまう><

またちょっと調べます。(まぁWebサービスとWebアプリを一緒にしなきゃいいんだけど)