4

私は Java EE から 6 か月間離れていましたが、現在戻ってきて、アプリケーションをJava EE 7に移行しています。JSR-341/EL 3.0 仕様に気付きました。セクション型変換(現在はセクション 1.23、以前はセクション 1.18)の変更が含まれています。

セクション 1.23 では、 String を除くさまざまな型すべての最初のルールは、X が null で Y がプリミティブでない場合は null を返すというものです。これは非常に歓迎すべき変更です。

したがって、私の最初の質問は次のとおりです。セクション1.23.3 Coerce A to Number type Nに関して、

EL 2.1:

A が null または "" の場合、0 を返します。

EL 3.0 では:

A が null で N がプリミティブ型でない場合は、null を返します。
A が null または "" の場合は、0 を返します。

システム プロパティを設定する必要はなくなりましたorg.apache.el.parser.COERCE_TO_ZERO=falseか?


次に、疑問を投げかける他のいくつかの変更があります。

最初のサブセクション、セクション 1.23.1 (以前の 1.18.1) To Coerce a Value X to Type Yでは、一般的なケースのルールが与えられています。今、新しい箇条書きが追加されました(強調は私のものです):

X が null で、Y がプリミティブ型でも String でもない場合は、 null を返します。

セクション 1.23.2 Coerce A to Stringでは、最初の 2 つの箇条書きが反転しています。それらは現在、次の順序になっています。

A が null の場合: return “”<br> それ以外の場合、A が String の場合: return A

以前は null 文字列は強制後に null 文字列のままでしたが、現在は null 文字列が空の文字列に強制されているようです。私の 2 番目の質問は、強制に関して、文字列が他の種類のオブジェクトとは異なる方法で扱われるようになったことを正しく読んでいますか? もしそうなら、なぜですか?

null には特別な意味があることは誰もが知っているため、このような変更は直感に反するように思えます。さらに、このような変更は、私が移行しようとしているコードに悪影響を与える可能性があるため、憂慮すべきものです。このコードは、もともと古い仕様に対して書かれていました。

最後に、私の 3 番目の質問は、Bean の検証についてはどうですか? これは@NotNull、強制された文字列値が null になることは決してないため、バッキング Bean の文字列の注釈は役に立たないということですか? 疑わしいですが、新しい変更がどのように連携するか知りたいです。

4

1 に答える 1

4

システム プロパティを設定する必要はなくなりましたorg.apache.el.parser.COERCE_TO_ZERO=falseか?

Apache EL パーサー(特に Tomcat で使用されているもの) を使用している場合、それは正しいことです。つまり、彼らはついに私自身の要求を実行に移してくれました。

ただし、Wildfly を使用していることを考えると、Apache EL を使用せず、最初からこの部分をすでに持っているEL RI (GlassFish のように) だけであるため、特定のケースでは実際には適用できないはずです。これはEL仕様の小さな見落としであり、Tomcatの担当者はこれについて非常にうるさかったです(彼らはTomcat 6.0.16までこの部分を正しく持っていて、仕様の見落としに「準拠」するためにそれを台無しにしました。オフにできるようにするために、このシステム プロパティを 6.0.17 に追加したという苦情の数)。


私はこれを正しく読んでいますか?強制に関して、文字列は他の種類のオブジェクトとは異なる方法で扱われるようになりましたか?

いいえ。順序は問題ではありません。結果は常に同じになります。nullとにかくではありませStringん。実装を明確にし、簡素化するために、順序が変更されている可能性があります。

JSF の観点から見ると、この EL 仕様セクションは EL 式の結果を HTML 出力 (Stringタイ​​プ) に書き込むことのみに関係しており、ご想像のとおり、送信/強制/変換/検証された値でモデル値を更新することはありません。そのためには、web.xmlJSF が送信された空の文字列の値を として解釈できるようにするために、次のコンテキスト パラメータが必要nullです。

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

この部分は、JSF 2.0/2.1 と比較して変更されていません。

于 2014-05-27T05:06:45.930 に答える