Seasar2でS2JDBCを使うときにハマった点

WebアプリフレームワークSeasar2の勉強をすることになり、 http://www.seasar.org/を見つつ環境を整え、SAStruts + S2JDBCでサンプルプログラムを作ろうとしたところハマったのでメモしておく。

Super Agile Struts - Setupを見ながら、5までは進み、チュートリアルが動かせる状態にしておく。

S2JDBC-Genが通らない

doltengを使いプロジェクトのテンプレートを作成。その後、データベースからS2JDBCを利用に必要なクラスを自動作成するために、プロジェクトのルート直下にあるs2jdbc-gen-build.xmlをAntで実行することになるが、このビルドが通らない。S2JDBCの設定は合っている。

DBが起動していない、接続ができない状態にある

プロジェクトのビルドパスにDBに対応するJDBCドライバは追加してある。なんのことはない。接続するべきDBが動いていなかった。データベースに接続し、そこに存在するテーブルからクラスを作成するのだから、情報が取れなければエラーになるのは自明。これは動作に対する理解が足りてなかった自分が悪い。

H2を使う場合はプロジェクトの右クリックから起動する。他のDBを使うのであれば、接続できるようにしておく。

S2JDBCの記法でDBが利用できない

しかし、実際にコードを書いてDBを利用しようとすると、実行時エラーが出る。

「クラス名が見つかりません」?これは確か、JDBCドライバが無いときに出るエラーのはず。しかし、プロジェクトのビルドパスには入っているし、S2JDBC-Genも通ったではないか……。

JDBCドライバはWEB-INF/の下、lib内に配置しないといけない

ここが一番ハマりました。具体的には4時間位ハマりました。

Seasar2のページからは記述を見つけられず、個人ブログでlib内に配置してうまくいったという記事がありました。libディレクトリは他の場所にも生成されているので間違わないように。

どうやらStrutsからの決まり事らしい。前提知識がないとこうなるということか……。

 

byte型とint型を算術演算子で処理した結果はint型になります


public class Main{
    public static void main(String[] args) {
        byte x = 3;
        byte y = 2 * x++;
        System.out.println(y);
    }
}

上記コードはコンパイルエラーになる。

byte型のyに代入するべき右辺の演算結果がint型になるので、キャストしないと代入できない。

int型とbyte型(short型、char型も同様)の演算結果は、値がbyte型(やshort型)の範囲であっても、intで返される。

参考:Javaの道:演算子(1.算術演算子)

List等を宣言するとき

OK

ArrayList<String> stringList = new ArrayList<String>();

ArrayList<String> stringList = new ArrayList<>();

ArrayListはListを継承してるので代入可。

List<String> stringList = new ArrayLis<>t();

ジェネリクスは片方だけでも可。

ArrayList stringList = new ArrayList<String>();

NG

String型はObject型に代入できるので行けるかと思いきや、両辺に指定する場合は型を揃えないといけない。

ArrayList<Object> stringList = new ArrayList<String>();

Ubuntu14.10をVirtualBox環境にインストールしようとしたら画面が砂嵐だった件

参考にしたページ

Installing Ubuntu 14.10 in Virtualbox (Troubleshooting Guide) - Make Tech Easier

 

環境

解決法

  1. 壊れた画面が表示されたら右Ctrl+F1キーを押す。
  2. コンソールが表示されるので、その画面で右Ctrl+F7を押す。
  3. 正常な画面に戻るので、インストールを続行する。