WebObjects | バグ?エラー?
- 2006.08.02
- WebObjects
WebObjectsのバグでしょうか?
それとも自分が悪いのか? ここに注意!
- 1. ■タイムスタンプと日付
- 2. ■400文字を越えた程度でエラー
- 3. ■ラジオボタン
- 4. ■起動しない!
- 5. ■WebObjects Builderでのコピーペーストに注意 – 1
- 6. ■WebObjects Builderでのコピーペーストに注意 – 2
- 7. ■WebObjects Builderでのコピーペーストに注意 – 3
- 8. ■WebObjects Builderでの注意
- 9. ■Xcodeでアプリを実行すると「ステータス 1 で終了しました」
- 10. ■EOModelerでの変更がプロジェクトに反映されない
- 11. ■TextField1の定義が無い?
- 12. ■ローカルでは正常に動作するが、サーバにアップすると動かない
- 13. ■デプロイしたら、動かない(上記と同じ)
■タイムスタンプと日付
ふだん日付フィールドは、日付だけが入力されていればいいと思う。だけど、入力日や修正日を記録したいときは時間も記録したい。
しかしながら時間が表示されたり、表示されないときがあるので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での変更がプロジェクトに反映されない
- EOModelerでモデルを変更する。 例えば、フィールドを追加したとする。
- javaアイコンをクリックして、マージしようとする。
- ここで、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行にしておきましょう。
-
前の記事
EOModelerでリレーションシップを張る 2006.08.02
-
次の記事
vi 2006.08.08