2010年10月15日金曜日

WebLogic 10g + EclipseLink

ゆえあって(...という表現はおかしいので仕事で)、
WebLogic 10gでTopLink 11gを使うことになった。

まずWebLogic 10gって何?という話だが、
これは10.3.0というバージョンのものを指す。
# 10.3.1以降は11gって表現するんだぜ。混乱なきように。

SmartUpdateを使って、パッチ番号9J3Aを当てると利用可能になる。
この方法は後述のTopLinkダウンロードサイトでも紹介されていて、公式手順ってことになる。
パッチにはEclipseLink1.0.1って書いてあるけど
実際に適用されたjarの中身を見てみたら1.0.2だった。

で、パッチを当てるだけで利用可能になるわけだが、
EclipseLinkのプロパティに気をつけなきゃいけない。

persistence.xmlに必ずこの指定を入れること。

  <property name="eclipselink.target-server" value="WebLogic_10"/>

これが無いと、どうもトランザクション周りがうまく動作しないことがあったので注意。

Oracle Fusion Middleware 11g Software ダウンロード

Oracle TopLink Software Downloads

2010年8月24日火曜日

[JavaFX] Button.action

これは単なる疑問。
Button クラスに action という変数(APIリファレンスとしては変数、という呼び方が正しいと思うが属性、でもよいような)があるのだが、これにはfunction (): Voidが必要なんだな。
だからまぁ、こう書く。

var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: function () {
    // 処理記述
  }
}
これでも良いんだけど、こう書きたくなってしまう。

var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: buttonAction()
}

function buttonAction () {
  //処理記述
}
これがダメなんですよー。actionはfunction()でないとだめ。だからVoid返すfunctionじゃダメで、こう書くことで回避できる。

var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: buttonAction()
}

function buttonAction (): function(): Void {
  function () {
  //処理記述
}
}
なんじゃこりゃと。2行にfunctionが3つも出てきてホントやめて欲しいのでこうする。

var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: function(){
    buttonAction()
  }
}

function buttonAction (): Void {
  //処理記述
}
何がなにやら。

以下、さくらばさん、bluepapa32さんからいただいたコメントにより加筆。
ありがとうございます!

結局、この例ではこうするのが一番良い。


var b = Button {
  layoutX: 10.0
  layoutY: 10.0
  text: "ボタン"
  action: buttonAction // <- 括弧無し
}

function buttonAction (): Void {
  //処理記述
}

関数を変数として扱うことが出来る反面、
括弧を付けてしまうと関数の結果だけが代入されてしまう。
action属性はfunction(): Voidという関数型の変数を割り当てる必要があるため、
こういう結果になるというわけ。

そうすると、引数付きの関数を呼びたい場合は
やはり一枚かませる必要がありそう。

さくらばさん (Java in the Box annex)
bluepapa32さんのブログ

2010年8月23日月曜日

[JavaFX] NetBeans JavaFX Composer

NetBeans 6.9 から本格利用が可能になった JavaFX Composer だけど
実際には何をしているのかをちゃんと見てみよう。

まず JavaFX プロジェクトで「新規」→「JavaFX デスクトップデザインファイル」を起動する。



このファイルが JavaFX Composer を利用するためのファイル。
そのプロジェクトで初めて利用する場合にはorg.netbeans.javafx.designパッケージが
作成され、その中に callback メソッドをもつクラスDeginStateが作成される。
# この解説はまた今度

エディタが起動して部品をdrag & dropで配置できる。



drag & dropによる配置とソースは直接関係しているのは言うまでもないが、
そもそもどうなっているかというと
  1. 読み取り専用のSceneが準備されていて
  2. 画面で配置した部品はすべて1.のScene.contentにバインドされているfunction(Node配列を返す)に追加されており
  3. getDesignSceneが1.のSceneを返すfunctionとして定義されている
  4. function runでStageが定義されていて、sceneに3.がバインドされている
そんなに難しいことをしているわけではない。
ただNetBeansでは編集不可フィールドとして定義されてしまうので細かいことをやろうとすると面倒。

2010年7月14日水曜日

JDeveloper 11gで起動しているWebLogicにデプロイできない

JDeveloper 11gのバンドルされているアプリケーションサーバは、
PreviewまではOC4Jだったけど正式リリース以降はWebLogic Serverがバンドルされている。

アプリの実行が出来ない状態に陥ったので少し調べ物をした。
以下、状況。
  • WebLogicSeverは正常起動(RUNNINGになる)する
  • /consoleはアクセスできるし、正常っぽい。
  • ただし、デプロイやアプリケーション実行が失敗する。サーバが起動中か停止していると言われる。動いてるのに!
  • 「接続」からIntegratedWebLogicServerの設定画面で接続テストすると、JSR-160(MBean)で接続失敗して云々とか出る。HTTP通信のみ成功しているように見える。
で、これが全然理由が分からなかったけどJDeveloper本体の設定でプロキシを外してJDevごと再起動したら解決した。なんだったんだろうか。


2010年7月1日木曜日

JavaFXの{__DIR__}

JavaFXのサンプルソース見てるとたまにこういうのが出てくる。

imageView = ImageView { image: Image{ url: "{__DIR__}test.png" } }

んで、これをNetBeansで実行させるとbuild配下にあるjarの中身を指すことになる。
urlさえあれば見に行けるので問題無いんだけど、画像なんかはまとめて置いておきたいじゃない?
コード上で{__DIR__}ってなってるとそのパッケージ配下を指してるようで、
たとえば上のコードがcom.battella.javafx.sampleというパッケージにあるクラスに記述されていると、
{__DIR__} は com/battella/javafx/sampleディレクトリを指すことになって、jarファイルでも同じ場所。

{__DIR__} を別のパッケージ配下で使えば{__DIR__}の指す内容が異なるわけで...
なーんか扱いづらさを感じるんだよね。そしたら普通に定数とかプロパティで
画像フォルダ持ってくるんで良いじゃんと。

NetBeans特有なのかどうか解らんのでちょっと調べないとだな。

2010年6月17日木曜日

JDeveloperでJAX-WS Webサービスを作成する。

はい、お久しぶりです。
しばらくJDeveloperネタが続くと思うよ。

JDeveloper11.1.1.3.0でWebサービスを作成しよう。手順は簡単。
  1. プロジェクトを作成するときに「Webサービス」をテクノロジとして選択する。
  2. 普通にJavaクラスを作成する
  3. アプリケーション・ナビゲータでクラスを右クリックして「Webサービスの作成」を選択
  4. 出てきたウィザードでWebサービスを設定、生成
  5. するとクラスに@WebServiceアノテーションがついてWebサービス扱い
で、問題は5.のステップで同時にできあがるweb.xmlなんだな。
こんな感じ。












自分で作成した何でもないクラスがServletとしてservlet-classに登録されとる。Servletでも無いのに。

まさかコンパイル時にextends HttpServletするわけでもあるまい、実行時にどうにかしてんだろと思って(正確にはDannyと議論になったので)、Thread.dumpStack()してみたのである(スタックトレースは一番最後ね)。

そしたらweblogic.wsee.jaxws.JAXWSServletなるクラスを経由して、最終的にMethod#invoke()している。実はこれ、Sun 参照実装(これは初回Webサービス生成時にオプションで選択可能)の時にはcom.sun.xml.ws.transport.http.servlet.WSServletというクラスがservlet-classに指定されるので、まぁ似たような実装になるんだろうなと。

実際にはSun参照実装の場合はsun-jaxws.xmlが必要になって、そっちでWebサービスの実装クラスを指定するんだけどそれはそれで設定ファイルが増えちゃうかなーと。実際にはJDeveloperが勝手に管理するので問題無いと言えば問題は無い・・・。

<略>
at java.lang.reflect.Method.invoke(Method.java:597)
at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:92)
at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:74)
at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:151)
at com.sun.xml.ws.server.sei.EndpointMethodHandlerImpl.invoke(EndpointMethodHandlerImpl.java:265)
at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:100)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:604)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:563)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:548)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:445)
at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:373)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:524)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:255)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:140)
at weblogic.wsee.jaxws.WLSServletAdapter.handle(WLSServletAdapter.java:208)
at weblogic.wsee.jaxws.HttpServletAdapter$AuthorizedInvoke.run(HttpServletAdapter.java:310)
at weblogic.wsee.jaxws.HttpServletAdapter.post(HttpServletAdapter.java:223)
at weblogic.wsee.jaxws.JAXWSServlet.doPost(JAXWSServlet.java:124)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at weblogic.wsee.jaxws.JAXWSServlet.service(JAXWSServlet.java:79)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
<以下略>


2010年3月15日月曜日

ATOK 2010

ATOK2010の広告が地下鉄に張ってあって気になっていたのだが、
サイトを見てみたら毎月使用料を払うライセンスがあるというので試用期間中。

ATOK自体がバージョンアップしても追加で払わなくて良いという点がとても良い。
まだ課金されてないけどなかなか快適なので、このまま使う予定。