WebObjects | バグ?エラー?

WebObjectsのバグでしょうか?

それとも自分が悪いのか? ここに注意!

 

■タイムスタンプと日付

ふだん日付フィールドは、日付だけが入力されていればいいと思う。だけど、入力日や修正日を記録したいときは時間も記録したい。

しかしながら時間が表示されたり、表示されないときがあるのでOracleのTIMESTAMPなどを試してみたが、EOModelerのバグでOracleには対応していなかった。

しかし、もっと簡単な方法があった。

EOModelerでName, Column, Value Class, と並んでいるずっと先に Value というフィールドがある。そこに「T」と一文字だけ入れればOK。

Valueフィールドが表示されていなければ、Add Columnから選んでValueフィールドを表示させる。

昔のEOModelerは、自動的に「T」が入っていたけど、今は手動になったのかな。Stringの「S」も省略されているなぁ。

 

■400文字を越えた程度でエラー

テキストボックスに400文字を越えたテキストを入力して保存しようとすると、エラーが発生する。

 Error: 
com.webobjects.eoaccess.EOGeneralAdaptorException: 
EvaluateExpression failed: : Next exception:SQL State:72000 -- error 
code: 1483 -- msg: ORA-01483: invalid length for DATE or NUMBER bindvariable

 OracleでそのフィールドにVARCHAR2(4000)を指定しているのに、わずか400文字程度でORA-01483エラーが起きてしまう。

回避策:VARCHAR2じゃなくて、CLOBを使いましょう。 

 

■ラジオボタン

WebObjects builderで、フォームの中にラジオボタンをコピーペーストしたときのこと。

コンパイル、そして起動後にフォームの送信ボタンを押すと、エラーメッセージが「we expected a boolean but received a java.lang.String with a value of false.」と表示される。

原因は、ラジオボタンの false が ”false” とダブルクォートで囲まれてStringになってしまっていた。ダブルクォートを削除して問題解決。

 

 

■起動しない!

起動スクリプトを作って、キックしても起動しない。

MyAppli.woa/Myappli を直接起動しても、すぐに終了する。

原因は、/home  のディレクトリが711だったため。

# chmod 755 /export/home

で解決。 

 

 ■WebObjects Builderでのコピーペーストに注意 – 1

WebObjects Builderで、作業をするときによくやるのが、コピーペースト。

例えば、これから新しくDealer.woを作るとき、 

  • Customer.woのレイアウトが、これから作るDealer.woのレイアウトとほぼ同じ。
  • 当然、Customer.woのレイアウトをDealer.woにコピーする。
  • そして、フィールド名や、WOString、WOHyperlinkを変更していく。

で、最終的にビルドして実行してみると、エラーが発生する。

エラーメッセージをよく見て、必要のないオブジェクトやWORepetition、WOConditionalなどが残っていたりするので、Dealer.html、Dealer.wodから削除する。

 

 ■WebObjects Builderでのコピーペーストに注意 – 2

 入力フィールドが、文字なのに、日付フォーマット”%Y/%m/%d”を指定したままだったり、数値フォーマットを指定したままだったりすることがよくある > オレ。

 

■WebObjects Builderでのコピーペーストに注意 – 3

 ひとつの入力画面で、同じ入力フィールドを2つ作ってしまうことがある。

Customer.name が画面の上の方。もう一つは、目立たなく画面の下の方にCustomer.name と。

上の方のフィールドに何度、「高橋」と入力しても「」と空白になってしまうのだ。

「何度、入力しても消えてしまうんです!」とユーザの声で気づいたのであった。

 

 ■WebObjects Builderでの注意

せっかく新しく追加した、UserPage.woがWebObjects Builderで開かなかったりします。

Open document
Failed to open component: /Users/..../UserPage.wo.
In setDocument:

WebObjects Builderを再起動するか、Macを再起動しましょう。

 

 ■Xcodeでアプリを実行すると「ステータス 1 で終了しました」

今まで、ビルドと実行が出来ていたのに、あるときから実行できなくなってしまうことがある。

あせっては、いけない。Mac自体を再起動するのだ。

それだけで、いつも通りに動いてくれる…はず。 

いざというときのために、毎回プロジェクトのフォルダごと コマンド+D で、バックアップしてからプログラミング作業に入りましょう。

 

■EOModelerでの変更がプロジェクトに反映されない

  1. EOModelerでモデルを変更する。 例えば、フィールドを追加したとする。
  2. javaアイコンをクリックして、マージしようとする。
  3. ここで、FileMergeというアプリケーションが起動する。

うーむ、FileMargeが起動してマージしてくれるはずがうんともすんとも言わない。

こんなときは、手動でマージする。EOModelerでEmployeeモデルを変更した場合、

プロジェクトのフォルダにEmployee.javaとEmployee.java.newがあるはず。これをFileMergeアプリケーションで、 

File > Compare Files…

  • Left  Employee.java
  • Right Employee.java.new

とファイルをドラッグしてCompareすればよし。FileMergeが調子悪ければ、テキストエディタでEmployee.java.newを開いて手動でコピーペーストする。

後で、Employee.java.newをゴミ箱に捨てる。

 

 ■TextField1の定義が無い?

こんなエラーが表示された。

Error: com.webobjects.appserver._private.WODeclarationFormatException: no declaration for dynamic element (or component) named TextField1
Reason: <WOHTMLTemplateParser> no declaration for dynamic element (or component) named TextField1

 

原因は、入力欄TextField1をコメントアウトした後に、同じページ内に入力欄を追加した。それがTextField1と内部的に命名されていたのだ。その入力欄を消したため、wodファイルからTextField1が削除されたので、コメントアウト内のTextField1と対になる定義を見つけられなくなってしまったらしい。

コメントアウト内の入力欄は使わなかったら削除しましょう。

 

■ローカルでは正常に動作するが、サーバにアップすると動かない

ログを見てみると、

[2006-12-05 20:24:10 JST] <WorkerThread9> <com.webobjects.appserver._private.
WOComponentRequestHandler>: Exception occurred while handling request:
java.lang.IllegalStateException: _obtainOpenChannel -- com.webobjects.eoaccess.
EODatabaseContext com.webobjects.eoaccess.EODatabaseContext@1e2ca7: 
failed to open database channel.  Check your connection dictionary, 
and ensure your database is correctly configured.

メッセージによるとコネクション、データベースの設定をチェックしろ!と。

おっしゃる通り、サーバ名を間違えておりました。

社外のVPN先のデータベースサーバなので、ローカルからのIPアドレスと、そのサーバ自身のIPアドレスが違うのでした。 

 

■デプロイしたら、動かない(上記と同じ)

ローカルでは、動くんですよ。でもサーバにアップすると動かない。Safariがこのようなメッセージを表示する。

The requested application was not found on this server. 

で、/usr/local/apache/conf/WebObjects.xmlを見ると、ちゃんと書いてある…つもりだったが、ここに落とし穴が!

  <application name="HelloWorld"
        retries="5"  protocol="http"  redir="http://hoge.jp/">
    <instance id="1" port="5010" host="127.0.0.1" sendTimeout="300" recvTi
meout="300"/>
  </application>

 そう!ターミナル上で、この記述をコピーペーストしたもんだから、recvTimeoutが、recvTi と meout と離ればなれになっていたのであった。

vi 上で、shift + J で上下の行をつないで修復完了。

ついでに、1行めと2行めの<application … jp/”>もつないで1行にしておきましょう。