2012/08/20

EclipseとMavenの統合

Eclipse(3.7)でMavenを使えるようにする。

mythのチームメイトに向けて。
既に4.2がリリースされている最中、今更感はありますが…、多分大きく変わらないだろうってことで。

1.Eclipseを起動し、「ヘルプ(H)」→「新規ソフトウェアのインストール...」の「一般用ツール」から「m2e - Eclipse 用 Maven 統合」を選択


2.同意して


3.再起動


4.slf4jも必要だった件。


5.また再起動


6.m2e Marketplaceから、m2e-wtpをインストール

※Eclipseのクイック・アクセス(Ctrl+3とか)から、m2eって検索掛けるとか。


7.WTP 用 Maven 統合を選択して

 

8.同意して


9.OKしてインストールして



10.再起動



インストールは以上。
使い方はまたそのうち・・・。


2012/07/05

順番を保持するHashMap

すごく初歩的な事なんだろうけど。

順番を意識しない場合は
Map<String, String> map = new HashMap<>();

順番を意識したい場合は
Map<String, String> map = new LinkedHashMap<>();


2012/06/11

Spring FrameworkのHandlerInterceptorについての備忘録。

チームメイトのJavaなねーさんに教えて貰ったのですが、Spring Frameworkには、HandlerInterceptorなるものがあって、このクラスをラップすることによって、各Contorollerクラスの前後で共通の処理を定義してあげる事が出来るそうな。
マジ女子力高い。


実装はこんな感じで。



public class HogeInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //  ここに処理を書く
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        //  ここに処理を書く
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        //  ここに処理を書く
    }
}




後はSpringの設定ファイルに



<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/*"/>
        <bean class="com.example.HogeInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

って追加してあげるだけ。
<mvc:mapping path>の値を指定してあげる事で、Contoroller毎に使用するインターセプターを切り替える事も出来るみたい。
ホント便利ね、Spring・・・。


で、今回ハマったのがafterCompletionメソッドのところ。
現在作っているシステムでは、レスポンスヘッダをちょこちょこと弄る必要があった為に、このafterCompletionメソッドで共通的に出力するレスポンスヘッダを設定していました。

ところが、ある特定の条件下のみ、この設定が反映されない現象が確認されて、ちょっと頭を悩ませていた感じです。
(httpに精通されている方であれば、もうこの地点で何が起こったか把握できるのでしょう・・・Zzz)

最初は設定を疑って、インターセプターがコールされていないんじゃないかと思ったのですが、どうやらコールそのものはちゃんとされているようでした。

で、その後いろいろ調べていたところ、最初自分はafterCompletionメソッドはContorollerの処理が終わった直後にコールされるのかと思っていたのですが、それは勘違いで、実際はViewのレンダリングが終わった後にコールされているみたいです。

ですので、例えばContorollerがhtmlやjsonなど、レスポンスボディに相当するデータを返却するような実装だった場合(っていうか殆どそうだと思いますが・・・。)、既にレスポンスヘッダは出力済みの状態となる為、afterCompletionメソッドでレスポンスヘッダの設定をしても、反映されなくなるというオチでした。

ですので、ヘッダの出力処理をpreHandleメソッドの方にて実行するよう修正する事で、問題なく動かすことが出来ました。
実際判明してみると非常にシンプルな問題なんですけどね・・・。

やはりこういったフレームワークはちゃんと理解して使わないと、いざこういったケースに陥った時にどうにもならなくなりますね・・・。
頑張って勉強しよう・・・Zzz

2012/05/18

My BatisのMapperクラスをSpringでDIする。

ハマったこと。

MyBatis Generatorで生成したMapperクラスを、SpringでDIしようとしたんですが、MyBatis Generatorで生成されるMapperクラスはインターフェースの為、実装クラスが見つからずにDIが出来ませんでした。

解決法

application-context.xmlに"sqlSessionFactory"と、各MapperクラスのBean定義を追加することで無事DIすることが出来ました。
いろいろと悩んだけど、実際わかってみるとすごくシンプルな事でした。


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="exampleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.example.mapper.ExampleMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

参考


会社の先輩に下記のサイトを教えてもらいました。
http://www.h3.dion.ne.jp/~alpha-pz/misc2743.html


2012/05/07

IntegerからStringへの型変換についてのめも

JavaでIntegerからStringへ型変換する時、ふとtoStringとvalueOfってどう使い分ければいいのかが気になったのでちょっと調べてみた時のメモ。

まずIntegerからStringへの型変換は

Integer num = 12345;
String str = null;
//  パターン1
str = num.toString();
//  パターン2
str = String.valueOf(num);
//  パターン3
str = "" + num;

の3通りがあるらしい。
10000000回ループして変換掛けまくってみたところ、速度的には

パターン1:334ms
パターン2:337ms
パターン3:776ms

って感じだった。
パターン1と2はほとんど差は無いけど、パターン3は劇的に遅かった。

※ まあコード的にもあまり好みじゃ無いからもともと使う気無いけど・・・、なんかphpみたいだし。
※※ とは言え、Integerにint突っ込むのも似たような事なんだけど・・・Zzz

ってことはまぁ、toStringもvalueOfもどっち使っても実行速度的には大差ないのかな。
ちょろっと実験しただけなので細かいところ見たら差があるのかもしれないけど。

ぁ、でも仮に変換対象がnullだった時に、valueOfはStringの"null"を返すけど、toStringの方はNullPointerExceptionが返って来るから、差があるとすればこの辺になるのかな??

あまり細かいところまで見てはないから結論は出てないけど、結局"適宜使い分ける"って事なのかな。
時間があるときもっと調べてみよ。



2012/02/06

Jenkinsのお勉強

昨日、こんな本を買ってみた。























仕事では嫌というほどお世話になってるけど、前任の方が構築してくれた環境を使っているに過ぎない現状なので、お勉強しなきゃなーと・・・。
まずは自動テストとかやりたいな。

ちゃんと勉強して、温厚なJenkinsさんを怒らせないように頑張ろう・・・。


2012/01/18

ブログって

続けることが何より難しい。

投稿したいネタはいっぱいあるんだけど、中々時間が取れない・・・Zzz
今年の目標だなあ~。