[YMIR-296] *[ymir-core] Date型の入力項目プロパティでリクエスト値が空の時にSetterが呼ばれない Created: 2009-01-24 Updated: 2009-02-02 Resolved: 2009-01-28 |
|
Status: | Closed |
Project: | Ymir |
Component/s: | ymir-core |
Affects Version/s: | 1.0.0 |
Fix Version/s: | 1.0.1 |
Type: | Improvement | Priority: | Minor |
Reporter: | jflute | Assignee: | skirnir |
Resolution: | Fixed | Votes: | 0 |
Labels: | None |
Description |
【概要】 Conversationで値を持ち回しているときに、 通常これは、あまり問題にはならないが、 例えば、入力画面と確認画面があったときに、 |
Comments |
Comment by skirnir [ 2009-02-02 ] |
確認ありがとうございました。closeとします。 |
Comment by jflute [ 2009-02-01 ] |
確認しました。Setterが呼ばれました。 |
Comment by skirnir [ 2009-01-28 ] |
リクエストパラメータについては、Stringとそうでない場合の挙動を合わせるため、populateWhereNull=trueの挙動をさせることにしました(r2710)。変更したい場合はpopulateWhereNull=falseと明示的に指定して下さい。 |
Comment by jflute [ 2009-01-27 ] |
議論の結果、Setterを呼ぶことに。 |
Comment by jflute [ 2009-01-26 ] |
コメントありがとうございます。 > 考慮すべきは、どちらのケースが多いか、だと思っています。 それよりも というのが自分の意見です。 ともあれ、そんなに直近で問題が発生する訳ではなさそうなので、 |
Comment by skirnir [ 2009-01-26 ] |
バグではないのでissue typeを変更しました。 |
Comment by skirnir [ 2009-01-26 ] |
@RequestParameter(または@Populate)で、値がnullの場合にSetterが呼ばれないのは仕様です。ちなみに@Inも、インジェクトされるものがない場合はSetterが呼ばれません。 ただし、@InについてはinjectWhereNullプロパティの値をtrueにすることでインジェクトするものがなくてもSetterを呼び出すようにはできますが、@RequestParameterや@Populateには対応するプロパティは存在しませんでした。そこで、まずは@RequestParameterと@PopulateにpopulateWhereNullプロパティを追加しました。 というわけで、@RequestParameter(populateWhereNull=true)とすれば、リクエストパラメータが空文字であってもDateプロパティのSetterが呼び出されるようになります。 しかしながらその一方で、「リクエストパラメータが空文字の場合、Setterを呼び出すべきか?」というディスカッションをする必要があると思いました。 Conversationの使い方によっては久保さんの言うように「空文字列でもSetterを呼び出す」という挙動が便利なこともありますが、「値が指定されなかった場合はデフォルト値を使う」という処理を書く場合は、例えばPageクラスの該当プロパティのデフォルト値をコンストラクタで指定しておけば、(リクエストパラメータが空文字列の場合にSetterが呼ばれずに)そのままデフォルト値を使うことができるので実装が楽になります。 考慮すべきは、どちらのケースが多いか、だと思っています。意見を聞かせてください。 ちなみにYmir流実装では、formに対応するDtoを生成し、ConversationにはモデルとなるBean(DBFluteのEntityなど)をバインドしておき、サブミット時にConverterを使ってDtoからBeanに値をコピーするというやり方を取ります。こうすると、今回のような問題は発生しません(ConverterはDtoのプロパティ値がnullでもそれをBeanにセットするので、もともとのBeanの値が残ってしまうということは発生しない)。 |
Comment by jflute [ 2009-01-24 ] |
優先度は「低」です。 |
Comment by jflute [ 2009-01-24 ] |
> 1. 入力画面で日付入力して確認画面へ に関しては、実際に試してみて発生しましたが、 |
Comment by jflute [ 2009-01-24 ] |
恐らくIntegerでも同じ話かと思います。 またBooleanでも同じ話ですが、CheckBoxはさらにややこしくて、 |