1. 無料アクセス解析

crossroad's Blog

Javaを中心にした技術ネタなど。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

2強DIコンテナ

もはや昨今のシステム開発で必須となった DIコンテナ。
Java で言えば、Spring と Seasar2 が2強と思います。

僕は基本的にはSeasar2派(?)で、ここ2~3年はSeasar2一本です。
と言うのも、数年前に両者を比較した際、Spring に比べて Seasar2 のほうが
定義ファイルの記述が洗練されていたからです。

個人的には、特にOGNLが使えることが大きいと思っていますが、
Seasar2 のほうが後発と言う事もあってか、全体的にSeasar2のほうが簡潔かつ自然ですね。

あとは、Ruby on Rails の影響を受けて、とにかく面倒を排除しているのも
実際のプロジェクトでは有利に働いていると思います。
# 設定ファイルの記述が多くなるのは、嫌がられますからね...


とそんな僕ですが、最近久しぶりにSpringに触れる機会が。
数年前と比べてどう進化しているか...と思ったのですが、正直思ったより変わってないな、と。

Seasar2に慣れたあとだと、「なんでこんなややこしいねん」と言う感があります。
特に設定ファイルの書き方は、かなり不自然に感じますね...
ナントカFactoryBeanとか、ほにゃららTargetSourceとか、トリッキー過ぎでしょ。
(いや、まぁそうせざるを得ないのはわかりますけどね)


まぁ誤解を恐れずに言えば、 Spring のほうがマニア向けですよね。
難しいけど、使いこなせば強力(??)、かつ自慢できるかも。
Hibernateもそうですけど、融通が聞く分、敷居が高い。
だから、コテコテの技術者は Spring を選ぶ傾向がある気がします。

Seasar2 は、「やさしく」と言うコンセプトもあって、使いやすい。
反面、コテコテの技術者からすると「勝手に色々やりすぎ」と感じるかも。


僕的には、現時点で言えば、Wicket + Seasar2 + S2Dao が良い気がします。
あ~いや、良いかどうかはプロジェクトの特性によりますね。
完全に個人的な好みです、ハイ。

スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2009/04/19(日) 03:09:38|
  2. ソフトウェア開発 Java
  3. | トラックバック:0
  4. | コメント:0

S2Flex2でIllegalAccessRuntimeException

S2Flex2で、以下のようなエラーが発生。


org.seasar.framework.exception.IllegalAccessRuntimeException: [ESSR0042]hoge.moge.Age で不正なアクセスがありました。理由はjava.lang.IllegalAccessException: Class org.seasar.framework.util.MethodUtil can not access a member of class hoge.moge.Age with modifiers "public static"
  at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:85)
  at org.seasar.framework.beans.impl.PropertyDescImpl.getValue(PropertyDescImpl.java:188)
  at org.seasar.flex2.core.format.amf3.io.writer.impl.Amf3TypedObjectWriterImpl.writeClassObjectProperty(Amf3TypedObjectWriterImpl.java:103)
  at org.seasar.flex2.core.format.amf3.io.writer.impl.Amf3TypedObjectWriterImpl.writeClassObjectProperties(Amf3TypedObjectWriterImpl.java:71)
    :
  at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.IllegalAccessException: Class org.seasar.framework.util.MethodUtil can not access a member of class hoge.moge.Age with modifiers "public static"
  at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
  at java.lang.reflect.Method.invoke(Method.java:578)
  at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:73)


Webで調べても明確な原因・対処法が見つからなかったのですが、
デバッガでトレースしつつ、S2Flexのソースを見ていくと、原因はDTOにありました。

S2Flex2がDTOをFlexクライアントに送信する際、DTOを走査しながら、
#getXxx()、#isXxx() を全て直列化しようとするようなのです。

この時、DTOに直列化不能(=リフレクションでアクセス不能)なオブジェクト
(具体的には、java.lang.Classオブジェクトなど)を返すような
#getXxx()が定義されていると、このエラーが発生するようです。

対応としては、DTO(とDTOに含まれるオブジェクト)には、
S2Flexが直列化できないオブジェクトを返す#getXxx()を定義しないように注意する、
しかないと思われます。




  1. 2008/02/14(木) 00:13:23|
  2. ソフトウェア開発 Seasar
  3. | トラックバック:0
  4. | コメント:0

Eclipse + Maven2 + Tomcat + Seasar2 の開発環境ベスト!?プラクティス

昨今、良くある(僕自身も好みの)組み合わせで、
 ・IDE・・・Eclipse
 ・ビルドツール・・・Maven2 及び Eclipse m2eclipseプラグイン
 ・コンテナ・・・Tomcat 及び Tomcatプラグイン
 ・フレームワーク・・・Seasar2 及び S2ファミリー
と言うのがあります。

しかし、開発環境構築は結構難問です。
Eclipse、Maven2、m2eclipse、Tomcatプラグイン...
それぞれ「個別の問題」にフォーカスしたツールを組み合わせようとすると、
細かいところでギャップがあって、各ツールの長所を活かしつつ、うまく連携させるには試行錯誤が必要です。


そこで、以下のような各ツールの長所を活かせる開発環境を作ってみる。

 1.Eclipse
  ・修正したソースのインクリメンタルコンパイル
  ・その他もろもろ...

 2.Maven2
  ・pom.xmlによるプロジェクトメタ情報の定義、一元管理
  ・ビルドの標準化

 3.m2eclipseプラグイン
  ・pom.xmlの依存ライブラリを修正するだけで、
   ライブラリのダウンロード、Eclipseビルドパスを自動更新

   (依存ライブラリを修正するたびに mvn eclipse:eclipse しなくて良い!)

 4.Tomcatプラグイン
  ・Eclipse上でTomcatの起動/停止。
  ・デバッグが簡単。(リモートデバッグしなくて良い!)
  ・DevLoaderを使えば、Warモジュールを作成することなく、
   修正したソースをTomcatに即反映可能


 5.Seasar2 2.4.xのSMART Deploy
  ・HOT deployで、Tomcat(のコンテキスト)を再起動することなく
   修正したソースをTomcatに反映可能

   Seasar2 2.4.x以上が必須になります。

つまり、
必要なライブラリは自動設定されて、修正したソースはTomcatに即反映されて、
Tomcat上でデバッグもできて、Mavenで一貫したビルドもでき、
しかも開発者ひとりひとりの手間を極力省くことができる、環境なのです!!(のはず)


では作り方。
ちなみに、この作業はアーキテクトだけが行う初期作業です。

 1.Eclipse
  特に特別な手順はありません。

 2.Maven2
  ①pom.xmlを書きます。
   maven-eclipse-pluginの設定で、downloadSourcesとdownloadJavadocsをtrueにしておきます。

  ②Eclipseのプロジェクト作成ウィザードを使うのが面倒なので、
   初回だけ「mvn eclipse:eclipse」でEclipseプロジェクトを作成し、Eclipseにインポートします。
   この時点では、クラスパス変数M2_REPOが未定義なので、ビルドエラーになります

  ③プロジェクトのプロパティ、Javaビルドパスから「M2_REPO/~」を
   全て削除します。当然、ビルドエラーになりますが、ここでは無視します。

 3.m2eclipseプラグイン
  ①m2eclipseをインストール。

  ②Eclipseの設定のMaven2で、ソースのダウンロードと、JavaDocのダウンロード
   を有効(チェックON)
にしておきます。

  ③プロジェクトを右クリック→Maven2 で、Maven2特性を有効にします。
   Maven2 Dependenciesと言うクラスパスコンテナが作成されます。
   この時点でビルドが通るはずです。

   これ以降は、pom.xmlを修正すればライブラリのダウンロード~ビルドパス設定が
   自動的に行われます。
   mvn eclipse:eclipse でビルドパスを更新する必要はありません

 4.Tomcatプラグイン
  ①Tomcatプラグインをインストールし、基本設定。
   
  ②dragon3さんが公開している改変版DevLoaderを入手し、
   Tomcatにセットアップ。

   TomcatプラグインにバンドルされているオリジナルのDevLoaderを使うと、
   pom.xmlにservlet-api-xxx.jarへの依存性が含まれていると実行時にClassCastExceptionが発生
します。
   逆に言えば、Servlet API を使わなければ、オリジナルのDevLoaderでも構いませんが、
   Servlet APIを使わないということは少ないのかなと思います。

  ③プロジェクトのプロパティ、Tomcatで以下の通り設定。
   ・Tomcatプロジェクト・・・ON。
   ・コンテキスト名・・・任意の名前を入力。
   ・コンテキスト定義の更新を可能にする・・・ON。
   ・このコンテキストを再読込可能にする・・・OFF
    (ONにすると、ソースを修正するたびにコンテキストが再起動してしまいます)
   ・Webアプリケーション・ルートとするサブディレクトリ・・・main/src/webapp
   ・開発用クラスローダを有効にする・・・ON
    /PROJECT_NAME/target/classes
    org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER をチェックON。
    (個々のライブラリをチェックONにしてしまうと、.tomcatpluginに絶対パスが書かれてしまい、再配布できません)

 5.Seasar2
  env.txt で、開発時はHOT Deployが有効になるようにしておきます。
  こうすることで、コンテキストを再起動することなく、修正したソースをTomcatに即反映できます。

 6.配布
  pom.xml.classpath.project.tomcatplugin を含めて、プロジェクトを配布(CVSやSVNにコミット)します。
  (通常はpom.xmlだけで、.classpath等は含めないことが多いと思いますが)

  なお、これらのファイルに特定の環境に依存する値(絶対パスなど)が書かれていないのが、再配布可能にするミソです。

  各開発者は、配布されたプロジェクトをEclipseにインポートするだけで、
  特別な設定をしなくても開発できる
はずです。


以上で、快適な開発環境ができる...と思います。

一応、ざっくりと動作確認していますが、うまくいかなかった場合はご容赦をm(_ _)m


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2007/10/16(火) 00:18:07|
  2. ソフトウェア開発 Java
  3. | トラックバック:1
  4. | コメント:0

S2Flex2のサンプルが動かない(XIncludeに注意)

S2Flex2の技術調査で、配布されているサンプルを動作させようとしたのですが、
なかなか動作せず、ハマりました。

【環境】
 ・JRE 5.x
 ・Tomcat 5.0.x
 ・S2Flex2 1.1.0

【現象】
 サンプルをTomcatにデプロイし、ブラウザからアクセスすると、
 ブラウザ上に
 「Error #2044: ハンドルされていない NetStatusEvent : level=error,
code=NetConnection.Call.Failed

 と言うエラーが表示され、動作しない。

 サーバ(Tomcat)のログには、
 WARN 2007-08-29 11:35:34,515 [http8080-Processor24] org.seasar.flex2.rpc.remoting.message.io.reader.impl.Amf3MessageReaderImplのプロパティ(references)が見つからないので設定をスキップします
 WARN 2007-08-29 11:35:34,515 [http8080-Processor24] org.seasar.flex2.rpc.remoting.message.io.reader.impl.Amf3MessageReaderImplのプロパティ(dataReaderFactory)が見つからないので設定をスキップします
 WARN 2007-08-29 11:35:34,546 [http8080-Processor24] org.seasar.flex2.rpc.remoting.message.io.reader.impl.Amf3MessageReaderImplのプロパティ(sharedObject)が見つからないので設定をスキップします
 DEBUG 2007-08-29 11:35:34,640 [http8080-Processor24] HOT deployを終了しました
 StandardWrapperValve[gateway]: サーブレット gateway のServlet.service()が例外を投げました
 java.lang.NullPointerException
 at org.seasar.flex2.rpc.remoting.message.io.reader.impl.AmfMessageReaderImpl.clean(AmfMessageReaderImpl.java:102)
 と出力されている。

【原因】
 直接の原因は、サーバログにワーニングとして表示されているように、
 コンポーネントの自動バインディングが正しく行われていないことです。

 なぜ、自動バインディングが行われていないか?は、diconのインクルード
 方法が関係していました。

 S2Flex2関連のdiconファイルでは、インクルードにXInclude(<xi:include .../> )が使用されていますが、
 Tomcat 5.0.xにバンドルされているXMLパーサ(Xerces 2.6.x)は、 XIncludeをサポートしていない
ようなのです。
 (参考 SeasarファウンデーションのXIncludeに関するドキュメント

 このため、diconファイルが正しくインクルードされず、インクルード先の
 diconに定義されているコンポーネントが認識されていないのでした。

【対処】
 対応としては、Tomcat 5.0.xにバンドルされているXMLパーサを使用しないようにすれば良いです。

 具体的には、TOMCAT_HOME/common/endorsed の下にある、xercesImpl.jar と xmlParserAPIs.jar
 を削除
すれば、JREにバンドルされているXMLパーサが使用されるようになります。

 JRE 5.xのXMLパーサは、XIncludeをサポートしているようなので、問題は解決しました。
 (前出のドキュメントによると、JRE 1.4.xのXMLパーサはXInclude未サポートなので、
  この対応をしてもダメ。)

 もしかすると、Tomcat 5.5.xだと問題が発生しないかもしれないですね。(未確認)





 

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2007/09/01(土) 18:57:49|
  2. ソフトウェア開発 Seasar
  3. | トラックバック:0
  4. | コメント:2

本日の Seasar Teeda 学習のまとめ

今日もしこしことTeedaでJSFのお勉強です(^^;

提供されているサンプルを参考に、プログラミングしてみたのですが、
細かいことで何箇所かつまずきました。

1.PageやActionが呼び出されない
 conversion.dicon のルートパッケージ名を、実際のパッケージ名
 にあわせて修正していませんでした。

 その為、PageやActionがDIコンテナに自動登録されていませんでした。

 当初、「そういえば、diconにコンポーネント登録してないなぁ」と
 思ったのですが、サンプルを見てもPageやActionをコンポーネント登録
 している気配がない。

 「なぜこれで動くんだ~?」と思ったら、S2Containerの新機能、SMART Deploy と Creatorが働いていて、
 パッケージ構成とクラスの命名規則を守っていれば、自動的にコンポーネント登録されるのでした。

2.アクションメソッドが呼び出されない
 SUBMITボタンを作って、Pageクラスのアクションメソッドを呼び出すように
 したのですが、どういうわけか呼び出されない。
 Pageクラスのプロパティに値は設定されているので、HTMLとPageクラスの
 関連付けは正しく行なわれているようですが。。。

 原因は、HTMLのformのidの命名ミスでした。
 Teeda Extensionを使う場合、HTMLの各要素に色々と規約があるのですが、
 この規定に従ったidを付与していませんでした。

 以前に、S2StrutsやS2Daoを使った際も、ちょっとした命名ミスで
 結構ハマったことがあり、これはCoCでの注意点
だと思います。
 # しかも、命名ミスの場合は例外が発生しないことがあり、
 # 一見動いているように見えたりして調査が難しいことが多いです。
 # Seasarのソースを読まないと、原因特定できないことも少なくありません。

 SeasarファウンデーションのWebサイトを注意深く読めば、大抵は書いてある
 のですが、プロダクト毎に記述箇所が散らばっていることもあって、
 気づくのに時間がかかることもしばしば。。。

 実プロジェクトで使う時は、アーキテクトが命名規則一覧のようなものを
 作成・配布したほうが良さそう
な気がします。

3.ActionからServiceやLogicを呼び出すと、NoSuchMethodError
 ActionにインジェクトしたServiceやLogicを呼び出そうとすると、
 NoSuchMethodErrorが発生しました。

 インジェクトされたオブジェクトは、S2AOPによってバイトコードエンハンス
 されたものですが、リフレクションで getClass().getMethods() すると、
 呼び出そうとしているメソッドは存在するように見えます。

 原因は...これまたServiceとLogicのクラス名の命名ミスでした。
 僕は、慣例的に
  ・インターフェース・・・IHogeHoge
  ・実装クラス・・・HogeHoge
 のように命名するのですが、これがSMART Deployの規約(?)とあっていませんでした。

 正しくは、
  ・インターフェース・・・HogeHoge
  ・実装クラス・・・HogeHogeImpl
 です。

4.アクションメソッド起動時に、IllegalStateException
 アクションメソッド起動時に、

 java.lang.IllegalStateException: not readable
at org.seasar.framework.beans.impl.PropertyDescImpl.getValue(PropertyDescImpl.java:192)
at org.seasar.teeda.extension.interceptor.ActionSupportInterceptor.invoke(ActionSupportInterceptor.java:73)
 <以下略>

 が発生しました。

 原因は、Actionクラスに、PageインスタンスのGetterメソッドがないことでした。
 Actionクラスには、画面の入力値を保持したPageインスタンスが
 インジェクトされますが、インジェクトしてもらうだけなので、
 Setterだけで良いか、と思ってGetterを作成していませんでした。

 どうやら、S2AOPで拡張されたActionクラスが、オリジナルのActionクラスの
 フィールドにアクセスする際、Getterメソッド経由でアクセスするっぽいです。
 (S2AOPが、サブクラス化によってアスペクトをウィービングしているから...かな)

5.PageとActionのアクションメソッドの呼び出し優先順
 Teedaでは、アクションメソッドをPageクラスとActionクラスどちらにでも
 定義できる
ようですが、その呼び出される優先順は、

 (1)Pageクラス
 (2)Actionクラス

 のようです。

 なので、

 ・アクションメソッドをPageだけ定義し、Acitonには定義しない
  →Pageのアクションメソッドが呼び出される

 ・アクションメソッドをActionだけ定義し、Pageには定義しない
  →Actionのアクションメソッドが呼び出される

 ・アクションメソッドをPageとAciton両方に定義する
  →Pageのアクションメソッドが呼び出される
   (Actionに定義したアクションメソッドは意味がない)

 と言う事になります。


今日1日でいろいろ勉強になりました。
ほとんどが命名規約違反によるもので、それはSeasarサイトのドキュメントを
しっかり読めば回避できる
ものがほとんどです。

実際のプロジェクトでは、実装者全員がこのような問題に対処できるわけではないので、
やはりSeasarプロダクトを理解したアーキテクトなりがサポートする必要があるように思います。

アーキテクトは(特に開発初期は)少々大変かもしれませんが、
Seasarの各プロダクトはそれだけの価値があると思いますので、
自分がアーキテクトをできる場合は、積極的に採用(してもらえるように提案)したいと思います。

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2007/08/23(木) 21:03:06|
  2. ソフトウェア開発 Seasar
  3. | トラックバック:0
  4. | コメント:0
次のページ

プロフィール

crossroad

Author:crossroad
関西在住。男。
フリーランスのソフトウェアエンジニア。
エレキベース(Rock&Roll)とお酒が好物でございます。

カテゴリー

タグリスト

Java F1 フリーランス ベーシスト HARRY TheStreetSliders iPhone FX お酒 Seasar Maven eclipse Wicket マイホーム 野球 プロジェクトファシリテーション Rails Ruby UML お店 ソフトウェア Tomcat S2Flex2 jsf Teeda Eclipse タグライブラリ ajax タスク europa mylyn trac 

ブログ内検索

最近の記事

最近のコメント

最近のトラックバック

カレンダー

05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

月別アーカイブ

全ての記事を表示する

全ての記事を表示する

Twitter


RSSフィード

リンク

このブログをリンクに追加する

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。