1.8. アプリケーション検証項目一覧
1.8.1. WebOTX 旧バージョンの非互換項目
1.8.1.1. *.tld ファイルが不正な場所に存在しています
-
- チェック内容:
- Webプロジェクトの /WEB-INF/tags 配下に implicit.tld 以外の *.tld ファイルを検出します。
- メッセージレベル:
- 警告
- 説明:
- /WEB-INF/tags 配下に implicit.tld 以外の *.tld ファイルを配置した場合は、アプリケーションのロード時にエラーとなるよう WebOTX V9 から実装仕様を変更しました。
- これはJSP2.1仕様で変更された「JSP.7.3.1 Identifying Tag Library Descriptors Tag」の仕様によるものです。
- 回避するにはアプリケーション側で、/WEB-INF/tags 配下にある implicit.tld 以外の *.tld ファイルを、 /WEB-INF/tags以外の /WEB-INF 配下 (/WEB-INF/classes, /WEB-INF/lib は推奨しません) に移動するか、以下の設定を行ってください。
- JVMシステムプロパティ
- -Dcom.nec.webotx.webcontainer.jsp.TldInTags=true。
1.8.1.2. Connection の setAutoCommit メソッドの呼び出しを確認してください
-
- チェック内容:
- java.sql.Connection の getAutoCommit() メソッドの呼び出し箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- java.sql.Statement.getConnection メソッドで返却されたjava.sql.Connection (JDBCドライバベンダのJDBCコネクション) の setAutoCommitメソッドを直接呼び出さないでください。呼び出すと、JDBCデータソースによるautoCommitモードの自動変更が正しく行われません。
1.8.1.3. Cookie 値のチェック処理の変更を確認してください
-
- チェック内容:
- javax.servlet.http.HttpServletRequest のgetCookies() の呼び出し箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Cookie の値に制御文字、特定記号「() <> @,;:\"/[]?={}」、スペース、タブが含まれていた場合のチェック処理が WebOTX V8 と V6/V7 で違うため取得できる Cookie 値が異なる。WebOTX V8 でも V6/V7 と同じチェックをするJVMオプ ションを追加。
- 例) WebOTX V6/V7互換で動作させる場合のJVMオプション設定例
- -Dcom.nec.webotx.enterprise.cookieValueCheck=false
- true : RFC2109準拠(既定値)
- false : V6/V7互換動作
- またnec-web.xmlにオプション指定することでWebアプリケーション毎に動作を設定することが可能。
- 例) WebOTX V6/V7互換で動作させる場合のnec-web.xml設定例
- <nec-web-app>
- <context-root> hoho </context-root>
- <property name="cookieValueCheck" value="false"/>
- ...
- </nec-web-app>
1.8.1.4. EJB エンドポイント上で無効な WS-ReliableMessaging が利用されています
-
- チェック内容:
- ソースフォルダ内の *.wsdlに WS-ReliableMessaging の名前空間を利用する場合とソースフォルダのルートにwsit-*.xml ファイルが配置されることを検出します。
- メッセージレベル:
- エラー
- 説明:
- EJBエンドポイント上で WS-ReliableMessaging の機能はサポートされません。
- WebサービスがEJBエンドポイント上で動作する場合は、WS-ReliableMessaging を利用しないように変更します。
- 修正方法:サポートされない WS-ReliableMessaging の機能を削除します。
1.8.1.5. EJB プロジェクトに複数の Web サービスエンドポイントが定義されています
-
- チェック内容:
- 1つプロジェクト内に、2つ以上のWebサービスエンドポイントに@WebService のアノテーションが付与された場合を検出します。
- メッセージレベル:
- エラー
- 説明:
- Standard/Enterprise において、Web サービスエンドポイント複数含む EJB をひとつのプロジェクト上で作成し配備した場合、そのうちのひとつのWebサービスしか呼び出すことができません。
- 別のプロジェクトに分けてアプリケーションを作成するようにします。
- 修正方法:Web サービスエンドポイント毎に EJB プロジェクトを作成するようにします。
1.8.1.6. HttpServletRequest getAttribute メソッドの戻り値タイプの変更を確認してください
-
- チェック内容:
- javax.servlet.ServletRequest のgetAttribute() の呼び出し箇所、その中のパラメータStringが"javax.servlet.request.key_size"を検出します。
- メッセージレベル:
- 警告
- 説明:
- ServletRequest.getAttribute("javax.servlet.request.key_size")を使用している場合、WebOTX V7以前は String オブジェクトが返却されていましたたが、V8以降は Integer オブジェクトが返却されます。
1.8.1.7. V8以前の実装形式で WS-ReliableMessaging が利用されています
-
- チェック内容:
- web.xmlに以下の <servlet-class> が定義されていることを検出します。
- <servlet-class>com.nec.webotx.webservice.wsrm.transport.servlet.RMServlet</servlet-class>
- メッセージレベル:
- エラー
- 説明:
- WS-ReliableMessaging は、V8以前の機能および設定ファイルに互換性がありません。
- V8以前の機能を利用しているWebサービスを更新する場合、[アプリケーション開発ガイド(Java EE) >
1. Webサービスアプリケーションの開発 >
1.2.14. WS-ReliableMessaging >
1.2.14.3. Webサービスクライアントの作成]を参照してアプリケーションを修正してください。
1.8.1.8. V8以前の実装形式で WS-Security が利用されています
-
- チェック内容:
- org.apache.ws.security.* のパッケージを利用する箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- WS-Security は、V8以前の機能および設定ファイルに互換性がありません。
- V8以前の機能を利用しているWebサービスを更新する場合、[アプリケーション開発ガイド(Java EE) >
1. Webサービスアプリケーションの開発 >
1.2.13. WS-Security >
1.2.13.3. クライアントアプリケーションの定義]を参照してアプリケーションを修正してください。
1.8.1.9. コネクタコネクションプールのプールオブジェクトの変更を確認してください
-
- チェック内容:
- javax.jms.Connection の setClientID() の呼び出し箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- V8.11でのコネクタコネクションプールのプールオブジェクト変更により、JMSリソースアダプタを利用してJMSコネクションを取得する場合、コネクションファクトリリソースに対してクライアントIDを指定していると、次のエラーが発生する可能性があります。
- Exception caught: javax.jms.JMSException: WOJMSRA:CFA:allocation failure:createQueueConnection:Error in allocating a connection. Cause:
- WOJMSRA:MC:InvalidClientIDException-[C4052]: クライアント ID はすでに使用されています - MyClientID
- このような場合は、次のいずれかの対処を行ってください。
- コネクションファクトリリソースで「クライアントId の 共有(server.resources.jms-resource.jms-connection-factory.connection-factory-name.wojmsEnableSharedClientID) 」を行うように設定する。
- コネクションファクトリリソースで「クライアントID(server.resources.jms-resource.jms-connection-factory.connection-factory-name.wojmsConfiguredClientID) 」を設定せずに、アプリケーションで個別のクライアントIDを設定する。
- いずれの変更も行うことができない場合は、JMSサービスの設定により、プールオブジェクトを旧バージョンと同じにして回避することも可能です。
- otxadmin> set server.jms-service.property.wojmsConnectionPooling=false
1.8.1.10. ステートフル Session Bean の EJBContext クラスのメソッド呼び出しを確認してください
-
- チェック内容:
- javax.ejb.SessionBean を実装するクラスの ejbActivate、ejbPassivate メソッド内で、javax.ejb.EJBContext クラスの isCallerInRole、getCallerPrincipal メソッドの呼び出し箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- ステートフル Session Beanで、ejbActivate() と ejbPassivate() メソッド内から、EJBContext クラスの isCallerInRole() と getCallerPrincipal() メソッドを呼び出すことはできません。
- 修正方法:'isCallerInRole'、'getCallerPrincipal' メソッドの呼び出しを ejbActivate、ejbPassivate メソッドから削除します。
1.8.1.11. レスポンスヘッダにステータスを設定した場合の Content-Type を確認してください
-
- チェック内容:
- javax.servlet.http.HttpServletResponse の setStatus() の呼び出し箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- レスポンスヘッダにステータス(400以上) を設定し、レスポンスが出力済みだった場合、WebOTX V6/V7 は Content-Type に "text/html" を再設定するが、V8 は Content-Type の設定を行いません。 WebOTX V6/V7 と同じように "text/html" を再設定するJVMオプションを追加することができます。
- 例) WebOTX V6/V7互換で動作させる場合のJVMオプション設定例
- -Dorg.apache.catalina.valve.ResetInErrorReport=true
- true : V6/V7互換動作
- false : V8動作
- 既定値はfalse(V8動作)
1.8.2. Apache Tomcat の非互換項目
1.8.2.1. Context Environment コンポーネントをデプロイメント記述子に記述すべきです
-
- チェック内容:
- context.xml ファイル内 <Environment> 要素を定義する箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- web.xml ファイル内に <Environment> エレメントと同じ情報を定義する <env-entry> エレメントが存在しているかを確認します。
- 存在していないまたは情報が異なる場合、作成または更新する必要があります。
- 修正方法:Tomcat の Environment エレメントの代わりに web.xml の env-entry エレメントを使用します。
1.8.2.2. Context Listener コンポーネントをデプロイメント記述子に記述すべきです
-
- チェック内容:
- context.xml ファイル内 <Listener> 要素を定義する箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- 推奨処置としては、org.apache.catalina.LifecycleListener を使用する Java ファイルを、javax.servlet.ServletContextListener を使用するように変換して、適切な <listener> エレメントを web.xml ファイルに追加します。
1.8.2.3. Context Parameter コンポーネントをデプロイメント記述子に記述すべきです
-
- チェック内容:
- context.xml ファイル内 <Parameter> 要素を定義する箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- web.xml ファイル内に <Parameter> エレメントと同じ情報を定義する <context-param> エレメントが存在しているかを確認します。
- 存在していないまたは情報が異なる場合、作成または更新する必要があります。
- 修正方法:Tomcat の Parameter エレメントの代わりに web.xml の context-param エレメントを使用します。
1.8.2.4. Context Resource コンポーネントをデプロイメント記述子に記述すべきです
-
- チェック内容:
- context.xml ファイル内 <Resource> 要素を定義する箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- web.xml ファイル内に <Resource> エレメントと同じ情報を定義する <resource-ref> エレメントが存在しているかを確認します。
- 存在していないまたは情報が異なる場合、作成または更新する必要があります。
- 修正方法:Tomcat の Resource エレメントの代わりに web.xml の resource-ref エレメントを使用します。
1.8.2.5. Context ResourceLink コンポーネントをデプロイメント記述子に記述すべきです
-
- チェック内容:
- context.xml ファイル内 <ResourceLink> 要素を定義する箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- web.xml ファイル内に <ResourceLink> エレメントと同じ情報を定義する <resource-ref> エレメントが存在しているかを確認します。
- 存在していないまたは情報が異なる場合、作成または更新する必要があります。
- 修正方法:Tomcat の ResourceLink エレメントの代わりに web.xml の resource-ref エレメントを使用します。
1.8.2.6. Context Valve コンポーネントを使用しないでください
-
- チェック内容:
- context.xml ファイル内 <Valve> 要素を定義する箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- Java サーブレット・フィルターを使用すれば、Java EE で Valve コンポーネントの機能を実現できます。
- Apache Tomcat の Valve コンポーネントの代わりに Java サーブレット・フィルターを使用します。
1.8.3 Apache Tomcat と WebOTX 旧バージョンの共通の非互換項目
1.8.3.1. RequestDispatcher forward 後のレスポンス flush タイミングの変更を確認してください
-
- チェック内容:
- javax.servlet.RequestDispatcher の forward() メソッドの呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- RequestDispatcherクラスの forward メソッドを利用してリクエストの別のサーブレットに転送した場合に、レスポンスが flush (コミットされてクライアントに返却される)されるタイミングが V7.x と V8.x で異なります。
- V7.x - forward 先サーブレットの処理が終了し forward 元に処理が戻り、forward元のリクエストの処理も完全に 終了してからレスポンスが flush されます。
- V8.x 以降 - forward 先サーブレットの処理が終了して forward 元サーブレットに戻った時点でレスポンスが flush されます。
- 上記の既定値を変更する方法は次の2通りです。
- 1) JavaVM オプションで次のオプションを指定
- com.nec.webotx.enterprise.forwardResponseFlush=true/false
- 2) nec-web.xml で次のプロパティを指定
- <nec-web-app>
- ...
- <property name="forwardResponseFlush" value="true or false"/>
- ...
- </nec-web-app>
1.8.3.2. Servlet のリスナ機能の中でJNDIを利用しないでください
-
- チェック内容:
- ServletContextListener, ServletContextAttributeListener, HttpSessionActivationListener の実装クラスに、javax.naming.*パッケージを利用する箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- ServletContextListener、ServletContextAttributeListener、HttpSessionActivationListener 内でJNDI(名前環境の lookup 等)を利用すると、Exception が発生する場合があります。
- 修正方法:JNDI(名前環境の lookup 等)を利用しないことを確認します。
1.8.3.3. Web コンテナおよび EJB コンテナ内でスレッドを開始してはいけません
-
- チェック内容:
- Web プロジェクトおよび EJB プロジェクトで、java.lang.Thread の start() メソッドまたはjava.lang.Runnable の run() メソッドの呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Web コンテナおよび EJB コンテナで実行されるコードは、スレッドの開始を許されません。
- Web コンテナおよび EJB コンテナで実行される場合は、新規スレッドを作成する代わりに、作業マネージャーを使用して非同期 Bean をスケジュールに入れる必要があります。
- 修正方法:Web モジュールおよび EJB モジュール内でスレッド開始する代わりに、作業マネージャーを使用して非同期 Bean をスケジュールします。
1.8.3.4. context-root に無効な / を含む値が指定されています
-
- チェック内容:
- nec-we.xml の context-root要素に / のを含む値が定義されている箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- コンテキストパス(http:// <ホスト名> : <ポート番号> / <ContextPath> / <ServletPath> / の <ContextPath> の部分)に、たとえば "/sample/ap" のように "/" を含む場合、一部の機能が利用できません。
- 利用できないのは次の機能です。
- 1) セッションレプリケーション
- 2) アドバンスドモードにおけるリクエスト振り分け
- 上記機能を利用する場合は、 <context-root> の値を "sample_ap" のように '/' が含まれない形に変更します。
- 修正方法:'/' を '_' に変更します。
1.8.3.5. resource-ref が対応する WebOTX 固有デプロイメント記述子定義が欠落しています
-
- チェック内容:
- web.xml内の <resource-ref> 要素の子要素 <res-ref-name> で定義されるnameは、nec-web.xml の <resource-ref> 要素の子要素 <res-ref-name> で定義されていない、このような箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- アプリケーションからJDBCデータソースをルックアップする際に、引数として"java:comp/env/"から始まる文字列(環境ネーミングコンテキスト名) を用いている場合、 環境ネーミングコンテキスト名と JDBC データソースの JNDI 名(JNDI物理名) とのマッピングを nec-web.xml に resource-ref 要素 として記述する必要があります。
- 例:
- ...
- <res-ref-name> MyResourceRefName </res-ref-name>
- ...
- で定義される場合、nec-web.xml に以下のエレメントを追加します。
- ...
- <resource-ref>
- <res-ref-name> MyResourceRefName </res-ref-name>
- <jndi-name> MyResourceRefName </jndi-name>
- </resource-ref>
1.8.3.6. security-role が対応する WebOTX 固有デプロイメント記述子の定義が欠落しています
-
- チェック内容:
- web.xml内の <security-role> 要素の子要素 <role-name> で定義されるnameは、nec-web.xml の <security-role-mapping> 要素の子要素 <role-name> で定義されていない、このような箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- たとえば以下のような定義がweb.xmlにある場合、
- ...
- <role-name> MyRoleMame </role-name>
- ...
- 以下のエレメントをnec-web.xmlに追加します。
- ...
- <security-role-mapping>
- <role-name> MyRoleMame </role-name>
- <principal-name> ... </principal-name>
- <group-name> ... </group-name>
- </security-role-mapping>
- ...
1.8.3.7. エラーページでは page ディレクティブが定義されていないことを確認してください
-
- チェック内容:
- web.xml の <error-page> 下の <location> 要素を検出します。
- メッセージレベル:
- 警告
- 説明:
- エラーページに page ディレクティブで contentType や pageEncoding を指定するとエラーページの表示で文字化けします。
- エラーページでは page ディレクティブを定義しないようにします。
1.8.3.8. コンテキスト・ルックアップが対応するデプロイメント記述子エントリーを持つ必要があります
-
- チェック内容:
- javax.naming.InitialContext のlookup() の呼び出す箇所を検出します。
- メッセージレベル:
- 情報
- 説明:
- lookup メソッドに対する引数は、web.xml ファイルで定義する必要があります。
- web.xml ファイル内に対応するエレメント resource-ref、 resource-env-ref、 または env-entry があることを確認します。
- 例:
- initCtx.lookup("java:comp/env/myInitialParam") ;
- を使用する場合、web.xmlに以下のいずれかを定義する必要があります。
- <resource-ref>
- <res-ref-name> myInitialParam </res-ref-name>
- ...
- </resource-ref>
- <resource-env-ref>
- <resource-env-ref-name> myInitialParam </resource-env-ref-name>
- ...
- </resource-env-ref>
- <env-entry>
- <env-entry-name> myInitialParam </env-entry-name>
- ...
- </env-entry>
1.8.3.9. 他のアプリケーションサーバに固有の MBean を使用してはいけません
-
- チェック内容:
- javax.management.ObjectName() のコンストラクタの呼び出し箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- WebOTX Application Server 以外のアプリケーションサーバによって提供される MBean を使用している場合は、WebOTX Application Server上で実行できる MBean にマイグレーションする必要があります。
1.8.3.10. 値が空の無効な load-on-startup が使用されています
-
- チェック内容:
- web.xml の <web-app> 配下の <servlet> 配下に値が空の <load-on-startup> 要素があった場合を検出します。
- メッセージレベル:
- エラー
- 説明:
- Servlet API 仕様 2.4 に準拠したWebアプリケーションで、web.xml に空の <load-on-startup> エレメントを含む場合は、そのWebアプリケーション(war)は配備できません。
- 空の <load-on-startup> エレメントを削除します。
1.8.3.11. 機能していない InvokerServlet が使用されています
-
- チェック内容:
- web.xmlに以下の <servlet-class> が定義されていることを検出します。
- メッセージレベル:
- 警告
- 説明:
- Tomcat 5.5 以前で機能していた InvokerServlet の機能が、セキュリティ上の観点から Tomcat 6.0 以降ではデフォルトで動作しないようになっています。Tomcat7.0 をベースにしている WebOTX V9 およびそれ以降ではこの問題が発生します。
- この機能を使用する場合は下記の設定が必要になります。
- システムプロパティ
- org.apache.catalina.servlets.enableInvokerServlet=true
1.8.3.12. 欠落している security-role の定義が Java EE デプロイメント記述子に使用されています
-
- チェック内容:
- web.xml内の <auth-constraint> 要素の子要素 <role-name> に設定されるnameは、 <security-role> の子要素 <role-name> で定義されていないnameを使用する、このような箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- 例:
- ...
- <role-name> MyRoleMame </role-name>
- ...
- で定義される場合、以下のエレメントを追加します。
- ...
- <security-role>
- <role-name> MyRoleMame </role-name>
- </security-role>
- ...
1.8.3.13. 無効な初期コンテキスト java:/comp が XML ファイルに使用されています
-
- チェック内容:
- XMl ファイル内「java:/comp」で始まる文字列を検出します。
- メッセージレベル:
- エラー
- 説明:
- 'java:/comp' を 'java:comp' に変更します。
1.8.3.14. 無効な初期コンテキスト java:/comp が使用されています
-
- チェック内容:
- ファイル内の「java:/comp」で始まるStringLiteralを検出します。
- メッセージレベル:
- エラー
- 説明:
- 'java:/comp' を 'java:comp' に変更します。
1.8.4. Java SE 5 の非互換項目
1.8.4.1. JAXP 1.1 パッケージ名をストリング・リテラルで使用しないでください
-
- チェック内容:
- 以下 JAXP 1.1 パッケージ名のストリング・リテラルとしての使用を検出します。
- org.apache.crimson.*
- org.apache.xml.*
- org.apache.xalan.*
- org.apache.xpath.*
- org.apache.xalan.xsltc.*
- メッセージレベル:
- エラー
- 説明:
- 内部 JAXP クラスが変更されましたので、以下のパッケージの内部クラスは使用しません。
- org.apache.crimson.*
- org.apache.xml.*
- org.apache.xalan.*
- org.apache.xpath.*
- org.apache.xalan.xsltc.*
1.8.4.2. JAXP API 使用法の互換性を確認してください
-
- チェック内容:
- 以下のパッケージを利用する箇所を検出します。
- javax.xml.parsers.*
- javax.xml.transform.*
- org.w3c.dom.*
- org.xml.sax.*
- メッセージレベル:
- 警告
- 説明:
- JRE 1.4.2 で使用した JAXP API を JRE 5 で使用すると、互換性の問題が発生する可能性がありますので、確認が必要です。
- 確認必要なパッケージは以下のとおりです。
- javax.xml.parsers
- javax.xml.transform
- javax.xml.transform.dom
- javax.xml.transform.sax
- javax.xml.transform.stream
- org.w3c.dom
- org.xml.sax
- org.xml.sax.ext
- org.xml.sax.helpers
1.8.4.3. String 値を派生させる場合は BigDecimal toPlainString メソッドを明示的に使用してください
-
- チェック内容:
- 以下箇所にBigDecimalクラスが利用される場合を検出します。
- @String's InfixExpression (+操作など)
- AStringBuffer の append() メソッドのパラメーター
- BStringBuilder の append() メソッドのパラメーター
- CString の valueOf() メソッドのパラメーター
- DPrintStreamの print() メソッドのパラメーター
- EPrintStreamの println() メソッドのパラメーター
- メッセージレベル:
- 警告
- 説明:
- BigDecimal の toString() メソッドの振る舞いは、前のバージョンとは異なります。
- J2SE 5.0 では BigDecimal に toPlainString() が追加されました。これは、以前のバージョンの toString() メソッドのように振る舞います。
- 推奨処置としては、 toString を toPlainString に変更します。
1.8.4.4. sun.* パッケージからの API を使用しないでください
-
- チェック内容:
- sun.*パッケージを利用する箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- sun.* パッケージの一部の API は JRE 5 で変更され、JRE 1.4.2 との間に互換性の問題があります。
- これらの API は、開発者が使用するためのものではありません。
1.8.4.5. 互換性のない BigDecimal クラスの toString メソッドが利用されています
-
- チェック内容:
- java.math.BigDecimal の toString() メソッドの呼び出す箇所を検出します。
- メッセージレベル:
- エラー
- 説明:
- BigDecimal の toString() メソッドの振る舞いは、前のバージョンとは異なります。
- J2SE 5.0 では BigDecimal に toPlainString() が追加されました。これは、以前のバージョンの toString() メソッドのように振る舞います。
- 推奨処置としては、 toString を toPlainString に変更します。
1.8.5. Java SE 6 の非互換項目
1.8.5.1. Duration と XMLGregorianCalendar equals メソッドの互換性を確認してください
-
- チェック内容:
- javax.xml.datatype.Duration の equals() と javax.xml.datatype.XMLGregorianCalendar の equals() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java 6 では、渡されたパラメーターが NULL の場合に FALSE が戻されるようになりました。 以前は NullPointerException がスローされていました。
- アプリケーション・ロジックを調べて、NullPointerException ではなく FALSE であることをコードでテストする必要があるかどうかを確認します。
1.8.5.2. EventHandler への呼び出しの例外ロジックを確認してください
-
- チェック内容:
- java.beans.EventHandler の constructor または create() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java SE 6 では、target、 action、または listenerInterface に対して NULL が渡された場合、EventHandler コンストラクタと create() メソッドは、
- IllegalArgumentException または NullPointerException をスローします。 前のリリースでは、NullPointerException は後から処理中にスローされました。
- アプリケーションに NULL パラメーターが原因の NullPointerException を処理するロジックが含まれている場合は、そのロジックを EventHandler 作成時のロジックに移動します。
1.8.5.3. FileChannel lock メソッドの OverlappingFileLockException を確認してください
-
- チェック内容:
- java.nio.channels.FileChannel の lock() の呼び出しでOverlappingFileLockException に対する catch ブロックがない場合、またはメソッドにOverlappingFileLockException の throws 宣言がない場合を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java SE 5 までは FileChannel.lock() メソッドが OverlappingFileLockException をスローしませんでしたが、Java SE 6 からは、OverlappingFileLockException をスローします。
- この変更がアプリケーションに影響がないかをご確認ください。
1.8.5.4. JMX ObjectName エレメント内のダブルスラッシュの使用を削除してください
-
- チェック内容:
- javax.management の ObjectName のコンストラクタに、domain 引数(コンストラクタの第一目引数) に"//"を含む場合を検出します。
- メッセージレベル:
- 警告
- 説明:
- JSR 255 では、javax.management.ObjectName のドメイン部分に「カスケード」の分離文字として「//」を使用する計画があります。 JSR 255 は Java SE 6 の一部ではありませんが、ObjectName のドメイン部分には、今後、互換性の問題が生じないように、ストリング「//」を含めないことをお勧めします。ObjectName は、次のような形式になっています。
- domain:key1=value1,key2=value2,key3=value3,*
- これに、不定数のキー・プロパティーが伴います。
- ご使用のアプリケーションに、ダブルスラッシュを使用したドメイン・ネームを持つ ObjectName の付いた MBean が含まれている場合は、これらの MBean のドメイン・ネームを変更する必要があります。
1.8.5.5. Runtime クラスの exec メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.lang.Runtime の第一目引数が String の exec() メソッドを呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- JDK 7u21 以降およびJDK 6u45 で java.lang.Runtime クラスの以下のメソッドの動作が変更されています。
- exec(String command)
- exec(String command, String[] envp)
- exec(String command, String[] envp, File dir)
- exec メソッドの第一引数に、以下のようにコマンド部分に空白が含まれる String を渡した場合、実行に失敗します。
- exec("C:\\Program Files\\bin\\foo.exe bar") ;
- コマンド部分をエスケープしたダブルクォーテーションで囲ったとしても、実行に失敗します。
- exec("\"C:\\Program Files\\bin\\foo.exe\" bar") ;
- 修正方法:
- 第一引数が String 配列であるメソッドを使用してください。
- exec(String[] command)
- exec(String[] command, String[] envp)
- exec(String[] command, String[] envp, File dir)
- コマンド部分と引数部分を配列の別の要素にして呼び出します。
- exec(new String[]{"C:\\Program Files\\bin\\foo.exe", "bar"}) ;
1.8.6. Java SE 7 の非互換項目
1.8.6.1. AWT 例外ハンドラーの振る舞いの変更を確認してください
-
- チェック内容:
- "sun.awt.exception.handler" という文字列を使用する箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java 7 では新規例外処理メカニズムが追加されています。
- 以前はシステム・プロパティー sun.awt.exception.handler が使用されていた箇所は、Java 7 で Thread.UncaughtExceptionHandler クラスを使用するように書き換える必要があります。
1.8.6.2. Character クラスの isLowerCase、isUpperCase メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.lang.Character の isLowerCase() 、isLowerCase()、isUpperCase() 、isUpperCase() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- 2つのメソッドは、JDK 7 で指定されたユニコード定義に準拠するように更新されました。以前に true を戻していたこれらのメソッドのインスタンスが現在では false を戻す可能性があります。またその逆の可能性もあります。
- これらのメソッドの振る舞いの変更がアプリケーションに影響がないかをご確認ください。
1.8.6.3. Comparable クラスの compareTo メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.lang.Comparable の compareTo() の実装箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- JDK 7 では、配列とコレクションにおいて、既定で使用されるソートアルゴリズム が変更されました。これが影響し、java.lang.Comparable 実装クラスが仕様に違反している場合、JDK 7 ではソートを行った際、java.lang.IllegalArgumentException をスローする場合があります。
- 例) 仕様に違反している場合の例
- a.compareTo(b) == 1 かつ b.compareTo(a) == 1が成立する場合
- また、次のシステムプロパティを指定すると、JDK 6 でのソートアルゴリズムが使用されるため、例外が発生しなくなります。ただし compareTo に矛盾があるため、ソートは正しく行なわれません。
- ‐Djava.util.Arrays.useLegacyMergeSort=true
1.8.6.4. DatagramChannel クラスの send、receive、connect メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.nio.channels.DatagramChannel の send() , receive() , connect() メソッドの呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- これらのメソッドは、メソッド呼び出し時にチャネルがバインドされていない場合に発生することに関して振る舞いの変更があります。
- 以前の振る舞いは、sun.nio.ch.bugLevel プロパティーを設定すれば復元できます。 これは、「1.4」、「1.5」、または「1.6」の値に設定できます。
1.8.6.5. File クラスの setReadOnly、setWritable、canWrite メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.io.File の
setReadOnly() ,
setWritable() ,
setWritable() ,
canWrite() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java 7 ではこれらのメソッドに新規の振る舞いが追加されました。
- Windows において、setReadOnly と canWrite メソッドはディレクトリーに関してDOSの読み取り専用属性をもう設定しません。Windows 環境でディレクトリーに対してこれらのメソッド呼び出されると、false を戻します。
- さらに java.io.File クラスのインスタンスがディレクトリを表す場合、canWrite メソッドは JDK 6 の場合、常に false を返していましたが、JDK 7 では常に true を返すように変更されました。
1.8.6.6. Formatter クラスの format メソッドの書式文字列に "% の s" を使用しないでください
-
- チェック内容:
- java.util.Formatter の format() メソッドの第一引数に"%#s"を含む場合、または java.io.PrintStream の printf() メソッドの第一引数に"%#s"を含む場合を検出します。
- メッセージレベル:
- エラー
- 説明:
- java.io.PrintStream オブジェクトに関するメソッド printf(String, ...) メソッドの第一引数に"%#s"を含む場合に、JDK 6 ではtoString() の結果が出力されていましたが、JDK 7 では仕様どおり、java.util.FormatFlagsConversionMismatchException がスローされます。
- 対処として、String については、"%#s" ではなく、"%s" を使用してください。
1.8.6.7. Locale クラスの getDefault メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.util.Locale の getDefault() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- このメソッドには、関連した振る舞いの変更があります。ユーザは現在では表示ロケール (たとえばストリングのビジュアル表示) または書式ロケール (たとえばストリングの実際の形式) にアクセスできるようになっています。これを実現するために、Java 7 では次の新規メソッドが追加されました。
- getDefault(Locale.Catgory cat)
- この場合、Locale.Category は DISPLAY オプションまたは FORMAT オプションがある新規列挙です。
1.8.6.8. MouseEvent クラスの getButton メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- instances of the java.awt.event.MouseEvent の getButton() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- このメソッドは、JDK 6 ではマウス・ボタンまたはスクロール・ホイールのアクションを表す [0-3] の範囲の int 値を戻すために使用されました。複数のスクロール・ホイールまたは 4 つ以上のボタンがある新規モデルのマウス・デバイスに合わせるために、JDK 7ではこのメソッドは、0 からボタンの数までの int 値を戻します。
- ユーザは、コードを評価し、振る舞いの変更によって影響を受けるかどうかを判断し、適切なテストを実施した上で、コードに必要な変更を加える必要があります。
- また、ユーザはプロパティー sun.awt.enableExtraMouseButtons を false に設定すると、JDK 6 の古い振る舞いを保存できます。
1.8.6.9. String クラスの intern メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.lang.String クラスの intern() 呼び出す箇所を検出します。
- メッセージレベル:
- 情報
- 説明:
- JDK 6 では、java.lang.String クラスの intern された文字列(文字列リテラル使用時と intern() メソッド呼び出し時に使用されます) は、パーマネント領域に割り当てられていました。JDK 7 では、通常のヒープ領域に割り当てられるよう変更されました。
- このため、JDK 6 使用時と比較すると、パーマネント領域の使用量は減少しますが、その分通常ヒープ領域の使用量は増加します。
- これが影響し、通常ヒープ領域が枯渇し、GC 多発や java.lang.OutOfMemoryError が発生する場合があります。(intern された文字列を多く使うアプリケーションほどメモリ使用量の差が顕著になります。)
- 対処として、VisualVM などを活用し、ヒープ領域およびパーマネント領域のサイズを調整してください。
1.8.6.10. ThreadGroup クラスの setMaxPriority メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.lang.ThreadGroup の setMaxPriority() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- API に関する資料には、「pri 引数が Thread.MIN_PRIORITY より小さいか、Thread.MAX_PRIORITY より大きいと、グループの最大優先順位は未変更のままです。」との記述があります。
- JDK 7 より前では、このメソッドには指定どおりの振る舞いがありませんでした。JDK 7 での変更は、この指定された振る舞いを実現するためのものです。
1.8.6.11. Toolkit クラスの getPrintJob メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.awt.Toolkit の getPrintJob() の呼び出す箇所に、NullPointerException の throws や catch 処理がない場合を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java 7 ではこのメソッドに新規の振る舞いがあります。ヘッドレス環境ではメソッド getPrintJob は、以前では HeadlessException をスローしていました。
- 現在ではこのメソッドは正しい NullPointerException をスローします。
1.8.6.12. URLConnection クラスと HttpURLConnection クラスの getInputStream メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.net.URLConnection の getInputStream() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java 7 ではこのメソッドに新規の振る舞いがあります。現在では getInputStream メソッドは、HTTP 接続で呼び出され、その接続で応答コード -1 が戻された場合、java.io.IOException をスローします。 以前はクライアント側で接続がハングしました。
- getResponseCode メソッドからの戻り値をチェックし、新しい接続を開くか、ストリーム上で getErrorStream を呼び出すことで -1 戻り値を処理し、この問題に対処してください。
1.8.6.13. Window クラスの setBackground メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.awt.Window の setBackground() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java 7 ではこのメソッドに新規の振る舞いがあります。このメソッドは、現在では UnsupportedOperationException をスローできます。
- この例外は、透明視覚効果をサポートしないシステムで実行していて、ウィンドウに透明背景色を適用する場合にスローされます。
- アプリケーションを Java 7 以上でのみ実行する場合、透明背景色の適用前に、コードで新規の GraphicsDevice.isWindowTranslucencySupported メソッドを使用してサポートをチェックすることができます。
- あるいは、アプリケーションを Java 7 以前のレベルで実行する必要がある場合、ウィンドウの背景を設定中に障害が発生すると、UnsupportedOperationException を処理してリカバリー・アクションをコーディングするように選択することができます。
1.8.6.14. 空の TreeSet クラスの add メソッドおよび TreeMap クラスの put メソッドでの振る舞いの変更を確認してください
-
- チェック内容:
- java.util.TreeSet の add() 、java.util.TreeMapの put() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java 7 ではこれらのメソッドに新規の振る舞いが追加されました。現在では上記のメソッドは、挿入されたオブジェクトが null であると、java.lang.NullPointerException をスローします。
- JDK の以前の実装では、add() メソッドまたは put() メソッドを使用した最初の挿入では、挿入されたオブジェクトが null であっても、java.lang.NullPointerException がスローされませんでした。
1.8.7. Java SE 8 の非互換項目
1.8.7.1. BigDecimal クラスの stripTrailingZeros メソッドの互換性を確認してください
-
- チェック内容:
- BigDecimal の stripTrailingZeros() 呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Java SE 7 以前では、計算上0(ゼロ) に等しい値に対して、上記メソッドが呼ばれるとき、その値自体が返却されていました。
- Java SE 8 では、定数の BigDecimal.ZERO が返却されるようになりました。
1.8.7.2. Class の getMethod、getMethods メソッドの戻り値の変更を確認してください
-
- チェック内容:
- java.lang.Class の getMethod java.lang.Class の getMethods呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- この返却値に共通するデフォルトメソッドが含まれる場合、Java SE 8u11以前では両方返却値に含めていましたが、Java SE 8u20以降では、メソッド呼び出し順の優先度が高いもののみを返却値に含むように修正されました。
1.8.7.3. Collection クラスの removeAll、retainAll メソッドへの呼び出しの例外ロジックを確認してください
-
- チェック内容:
- Collection の removeAll() と Collection の retainAll() 呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- JDK 7を使用し、引数に null が指定される可能性がある場合 では、コレクション自体が空の場合は処理が続行されていましたが、JDK 8 では、java.lang.NullPointerException がスローされます。
1.8.7.4. DateFormat クラスと SimpleDateFormat クラスの出力形式の変更を確認してください
-
- チェック内容:
- SimpleDateFormat と format() とDateFormat呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- JDK 8 ではこのメソッドの出力形式が一部変更されました。Java SE 7 以前で、DateFormatSymbols によって返却される月の名前の形式と Java SE 8 で返却される形式が変更されました。
- 日本語や英語や中国語に影響はありませんが、チェコ語、フィンランド語、クロアチア語、ポーランド語などに影響があります。多言語をサポートしていて上記クラスを使用している場合、実行結果に問題がないか確認してください。
1.8.7.5. NumberFormat クラスと DecimalFormat クラスの format メソッドの互換性を確認してください
-
- チェック内容:
- java.text.NumberFormat の format() と java.text.DecimalFormat の format() の呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- JDK 8 ではこのメソッドの振る舞いが変更されました。これまで誤った値が出力されていた処理について、正しい値が出力されるよう修正されました。
- たとえば、double型の“0.8055d”に対して、Format メソッドによる丸め処理を実行したとき、JDK7では0.806という結果に対し、JDK8では0.805という結果になります。
1.8.7.6. Proxy クラスのコンストラクタへの呼び出しの例外ロジックを確認してください
-
- チェック内容:
- java.lang.reflect の Proxy クラスおよびそのサブクラスのコンストラクタ() 呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- JDK 7 では、コンストラクタ java.lang.reflect.Proxy(InvocationHandler h) 呼び出し時に h が null の場合でも例外は発生しませんでしたが、JDK 8 ではjava.lang.NullPointerException がスローされます。
1.8.7.7. String クラスと Pattern クラスの split メソッドの戻り値の変更を確認してください
-
- チェック内容:
- 以下のメソッドの第一目引数が""の場合を検出します:
- java.lang.String の split()
- java.util.regex.Pattern の compile()
- メッセージレベル:
- 警告
- 説明:
- Java SE 8 では split() メソッドの返却値が変更されました。Java SE 7では、分割する文字列の先頭でゼロ幅で一致した場合に分割結果の先頭に空文字列が生成されていましたが、Java SE 8からは先頭に空文字列が生成されません。
- ソース例:
- String[] ret1="Sapmle".split("") ;
- String[] ret2=Pattern.compile("") .split("Sapmle") ;
- Java SE 7以前の実行結果:
- ret1=[,S,a,m,p,l,e]
- ret2=[,S,a,m,p,l,e]
- Java SE 8の実行結果:
- ret1=[S,a,m,p,l,e]
- ret2=[S,a,m,p,l,e]
1.8.7.8. TypeVariable クラスの getUpperBound メソッドの戻り値の変更を確認してください
-
- チェック内容:
- TypeVariable の getUpperBound の 呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- JDK 8 ではこのメソッドの返却値が変更されました。新しく導入された IntersectionType のインスタンスが返されるようになります(元は、DeclaredType のインスタンスが返されました)。
1.8.7.9. javax.xml.stream パッケージの一部クラスの newFactory メソッドの動作変更を確認してください
-
- チェック内容:
- XMLEventFactory の newFactory() , XMLOutputFactory の newFactory() , XMLInputFactory の newFactory() 呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- JDK 7 において、見上げて、サービスをインスタンス化する時に、2番目のパラメータ(ClassLoader) は工場によって無視されました。これはもう JDK 8 において事実ではありません。
1.8.7.10. 動的プロキシクラスが実装するインタフェースの可視性を確認してください
-
- チェック内容:
- java.lang.reflect.Proxy クラスの getProxyClass() 呼び出す箇所を検出します。
- メッセージレベル:
- 警告
- 説明:
- Publicでないインタフェースを実装する java.lang.reflect.proxy をスーパークラスとする動的プロキシクラスの可視性が JDK 7 では public だったが、JDK 8 では public でなくなります。そのため、Proxy.getProxyClass メソッドと Constructor.newInstance メソッドを使用してプロキシ・インスタンスを作成しているとき、「実装するインタフェースが public でない」かつ「呼び出し元が同じパッケージ内に配置されていない」場合にIllegalAccessExceptionで失敗します。
- IllegalAccessException が発生した場合、以下のいずれの回避策で対処できます。
- (1) Constructor.setAccessible を呼び出し、accessible フラグを true に設定する
- (2) Proxy.newProxyInstanceを使用してインスタンスを生成する