EclipseのSpring Bootで廃止メソッドの警告が出るのはどういうとき?新人エンジニア向けに解説

こんにちは。ゆうせいです。

今回は、EclipseでSpring Bootアプリを開発しているときに出る「廃止メソッドの警告」について解説します。

JavaやSpring Bootを学んでいると、Eclipse上でメソッド名に横線が引かれたり、黄色い警告マークが出たりすることがあります。

たとえば、次のような警告です。

The method xxx() from the type Xxx is deprecated

日本語にすると、「Xxx型のxxx()メソッドは非推奨です」という意味です。

ここでいう「廃止メソッド」とは、正確には「非推奨メソッド」と考えるとよいです。

今すぐ使えないわけではありません。

ただし、「今後は使わないほうがよい」「将来のバージョンで削除されるかもしれない」「代わりの新しい書き方を使ってください」というサインです。

Javaの@Deprecated注釈は、使うことが推奨されないプログラム要素を示します。OracleのJava APIドキュメントでも、@Deprecatedが付いた要素を非推奨でないコードから使用またはオーバーライドすると、コンパイラが警告を出すと説明されています。

廃止メソッドの警告はエラーではない

まず大事なのは、廃止メソッドの警告は、基本的にはエラーではないということです。

エラーなら、プログラムがコンパイルできなかったり、起動できなかったりします。

一方、警告は「動くけれど注意してね」という合図です。

種類意味プログラムは動くか
エラー文法や参照に問題があり、コンパイルできない動かない
警告今は動くが、直したほうがよい可能性がある動くことが多い
廃止メソッド警告古いAPIや将来削除予定のAPIを使っている動くことが多い

高校生にもわかるようにたとえるなら、廃止メソッドの警告は、道路標識の「この先、道幅が狭くなります」に近いです。

今すぐ通れないわけではありません。

でも、そのまま進むと将来困るかもしれません。

だから、早めに別の安全な道へ移りましょう、という意味です。

Eclipseで廃止メソッド警告が出る仕組み

Eclipseには、Javaコードをチェックするコンパイラ機能があります。

このコンパイラは、文法エラーだけでなく、使わない変数、型の不一致、非推奨APIの使用なども警告として表示します。

EclipseのJavaコンパイラ設定では、Java > Compiler > Errors/Warningsで、各種エラーや警告の扱いを設定できます。Eclipse公式ヘルプでも、この画面でErrors/Warningsの設定を行うと説明されています。

つまり、Eclipseが勝手に怒っているのではありません。

JavaやSpring Bootのライブラリ側で「このメソッドは非推奨です」と印が付いており、Eclipseがその印を見つけて警告してくれています。

先生が赤ペンで「この書き方は古いよ」と教えてくれているようなものです。

廃止メソッド警告が出る代表的な場面

EclipseのSpring Boot開発で廃止メソッド警告が出る場面は、主に次のようなときです。

場面内容
古いサンプルコードを使ったとき昔のSpring BootやSpring Securityの書き方をコピーした
Spring Bootのバージョンを上げたとき以前は普通だったメソッドが新バージョンで非推奨になった
Javaの古いAPIを使ったときDate系や古いコンストラクタなどを使った
ライブラリ側が新しい書き方へ移行中のとき将来削除予定のAPIに@Deprecatedが付いた
チュートリアルが古いときネット記事のコードが現在のSpring Bootに合っていない

特にSpring Bootでは、バージョンアップによって推奨される書き方が変わることがあります。

そのため、古いブログ記事や古い教材をそのままコピーすると、Eclipseで警告が出ることがあります。

そもそも@Deprecatedとは何か

@Deprecatedは、Javaの注釈、つまりアノテーションの1つです。

アノテーションとは、クラスやメソッドに付ける目印です。

@Overrideや@Autowiredの仲間だと考えるとわかりやすいでしょう。

たとえば、次のようなメソッドがあったとします。

public class SampleService {

    @Deprecated
    public void oldMethod() {
        System.out.println("古い処理です。");
    }

    public void newMethod() {
        System.out.println("新しい処理です。");
    }
}




oldMethod()には@Deprecatedが付いています。

このメソッドを別の場所から呼び出すと、Eclipseが警告を出します。

SampleService service = new SampleService();

service.oldMethod();

このコードは動くかもしれません。

しかし、Eclipseは「oldMethod()は非推奨ですよ」と教えてくれます。

@Deprecatedには、sinceとforRemovalという情報を付けられます。Oracleの説明では、sinceは非推奨になったバージョンを示し、forRemoval=trueは将来のリリースで削除される可能性があることを示します。

廃止メソッドには段階がある

廃止メソッドと聞くと、すぐ消えるように感じるかもしれません。

しかし、実際には段階があります。

段階意味対応の急ぎ度
非推奨今後は使わないほうがよい
代替APIあり新しい書き方が用意されている
forRemoval=true将来削除される予定があるかなり高い
削除済み新しいバージョンでは存在しないコンパイルエラーになる

たとえるなら、学校の部室が「今は使えるけれど、来年度から取り壊し予定です」と言われているようなものです。

今日の練習はできます。

でも、来年度も同じ部室を使う前提で計画を立てるのは危険ですよね。

非推奨メソッドも同じです。

Spring Bootで廃止メソッド警告が出る理由

Spring Bootで廃止メソッド警告が出るのは、Spring Bootや関連ライブラリが進化しているからです。

より安全な書き方。

よりわかりやすい書き方。

新しいJavaバージョンに合った書き方。

設定の仕組みの変更。

セキュリティ上の考え方の変更。

こうした理由で、古いAPIが非推奨になります。

Spring BootのAPIドキュメントにもDeprecated List、つまり非推奨APIの一覧があります。現在のSpring Boot APIにも、非推奨のクラス、メソッド、コンストラクタなどが一覧化されています。

つまり、廃止メソッド警告は、あなたのコードが完全に間違っているという意味ではありません。

「その書き方は古くなってきています。新しい書き方へ移行しましょう」というメッセージです。

古いネット記事を見たときに警告が出やすい

新人エンジニアがよく遭遇するのが、古いネット記事のコードをコピーしたときの警告です。

Spring BootやSpring Securityはバージョンによって書き方が変わることがあります。

たとえば、昔のSpring SecurityではWebSecurityConfigurerAdapterを継承する書き方がよく使われていました。

しかし、現在のSpring Securityでは、SecurityFilterChainのBeanを公開する構成が一般的です。Spring Securityの現在のAPIドキュメントでも、多くの場合はEnableWebSecurityとSecurityFilterChain Beanを使うと説明されています。

古い書き方のイメージです。

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .anyRequest().authenticated();
    }
}




現在の考え方に近い書き方のイメージです。

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .permitAll()
            );

        return http.build();
    }
}




このように、古いチュートリアルでは動いていたコードでも、今の環境では警告が出ることがあります。

ネット記事を読むときは、記事の公開日、Spring Bootのバージョン、Spring Securityのバージョンを必ず確認しましょう。

廃止メソッド警告が出てもすぐ直さなくてよい場合

警告が出たからといって、必ずその場で直さなければならないわけではありません。

次のような場合は、優先度を見て対応します。

状況対応
学習用の小さなサンプルまず動きを理解し、あとで新しい書き方を確認する
すぐ消える予定がない非推奨修正計画を立てる
業務に影響しないテストコード優先度を下げてもよい場合がある
ライブラリ内部の警告自分のコードで直せるか確認する

ただし、次の場合は早めに対応したほうがよいです。

状況理由
forRemoval=trueが付いている将来削除予定の可能性があるため
Spring Bootのメジャーバージョンアップ前移行時にコンパイルエラーになる可能性があるため
セキュリティ関連API古い書き方が安全でない場合があるため
大量に同じ警告が出ている後回しにすると修正コストが大きくなるため

廃止メソッド警告は、火災報知器というより、健康診断の注意項目です。

今すぐ倒れるわけではありません。

でも、放置すると将来大きな問題になるかもしれません。

Eclipseで警告を確認する方法

Eclipseでは、廃止メソッド警告をいくつかの場所で確認できます。

場所確認できること
エディタ上の黄色い波線どのメソッドが警告対象か
左側の黄色い警告マーク警告が出ている行
Problemsビュープロジェクト内の警告一覧
マウスホバー警告メッセージの詳細
Javadoc表示代替メソッドの説明

まずは、警告が出ているメソッドにマウスを乗せてください。

すると、Eclipseが「このメソッドはdeprecatedです」と教えてくれます。

場合によっては、代わりに使うべきメソッドや説明がJavadocに書かれています。

警告を見たら、すぐ消そうとするのではなく、まず意味を読みましょう。

廃止メソッド警告の調べ方

廃止メソッドの警告が出たら、次の順番で調べます。

順番やること目的
1警告が出ているメソッド名を確認する何が古いのか特定する
2マウスホバーで警告文を読むEclipseの説明を見る
3Open Declarationでメソッド定義を見る@DeprecatedやJavadocを確認する
4Javadocで代替APIを探す新しい書き方を見つける
5Spring公式ドキュメントを確認する正しい移行方法を知る
6小さく修正して動作確認する変更による影響を確認する

ここで大事なのは、警告文を読まずに@SuppressWarningsで消さないことです。

警告は邪魔者ではありません。

将来のバグを防ぐヒントです。

@SuppressWarningsで警告を消してよいのか

Javaには、@SuppressWarningsという警告を抑制するアノテーションがあります。

Eclipse公式ヘルプでも、@SuppressWarningsを使うと、コンパイル警告を局所的に無効化できると説明されています。

たとえば、次のように書くことがあります。

@SuppressWarnings("deprecation")
public void sample() {
    oldMethod();
}




この書き方をすると、deprecation、つまり非推奨API使用の警告を抑えられます。

しかし、新人エンジニアには基本的におすすめしません。

なぜなら、根本原因を直していないからです。

対応意味おすすめ度
代替APIに置き換える新しい正しい書き方に直す高い
理由をコメントして一時的に抑制する事情がある場合だけ使う
何も考えずSuppressWarningsする警告を見えなくするだけ低い

@SuppressWarningsは、部屋の火災報知器がうるさいから電池を抜くようなものです。

本当に誤報ならよい場合もあります。

でも、火元を確認せずに電池を抜くのは危険です。

自分で作ったメソッドに@Deprecatedを付ける場合

廃止メソッドは、Spring BootやJava標準APIだけの話ではありません。

自分のプロジェクトでも、古いメソッドに@Deprecatedを付けることがあります。

たとえば、古い検索メソッドを残しながら、新しい検索メソッドへ移行したい場合です。

public class CarService {

    @Deprecated(since = "1.2", forRemoval = true)
    public List<CarDto> searchOld(String keyword) {
        return searchByCondition(keyword, null, null);
    }

    public List<CarDto> searchByCondition(String keyword, Integer minPrice, Integer maxPrice) {
        // 新しい検索処理
        return new ArrayList<>();
    }
}




このようにしておくと、チーム内の他の開発者がsearchOld()を使ったときに警告が出ます。

つまり、@Deprecatedは「この道は古いので、次から新しい道を使ってください」と伝えるための目印でもあります。

廃止メソッド警告のよくある誤解

誤解正しい理解
警告が出たらすぐ動かない警告だけなら動くことが多い
Eclipseの設定がおかしい多くの場合、API側に@Deprecatedが付いている
黄色い警告は全部無視してよい将来の不具合や移行コストにつながる
SuppressWarningsすれば解決警告を隠しただけで根本解決ではない
古い記事のコードが必ず悪い当時は正しかったが、現在の推奨と違う場合がある

廃止メソッド警告は、開発者を困らせるためのものではありません。

むしろ、将来困らないように早めに知らせてくれる親切な仕組みです。

実務での対応方針

実務では、廃止メソッド警告に対して次のように対応するとよいです。

状況対応方針
新規開発中できるだけ新しいAPIに置き換える
学習中まず警告理由を理解し、代替コードを確認する
既存システム保守中影響範囲を見て計画的に修正する
バージョンアップ前優先的に非推奨APIを洗い出す
短期的に修正できない理由をコメントし、チケット化する

特に、Spring Bootのバージョンアップ前には廃止メソッド警告を軽視しないでください。

警告だったものが、新しいバージョンでは削除され、コンパイルエラーになることがあります。

「昨日まで動いていたのに、バージョンを上げたら動かない」という状況は、非推奨APIを放置したときに起きやすいです。

新人エンジニアが警告を見たときのチェックリスト

Eclipseで廃止メソッド警告を見つけたら、次のチェックリストを使ってください。

チェック確認内容
警告箇所どのクラス、どのメソッドか
警告文deprecatedと書かれているか
代替APIJavadocに代わりのメソッドが書かれているか
削除予定forRemoval=trueか
使用バージョンSpring BootやJavaのバージョンはいくつか
ネット記事の日付古い記事を参考にしていないか
影響範囲同じメソッドを何か所で使っているか
対応方針今直すか、後で計画的に直すか

警告を見たら、まず「なぜ警告が出ているのか」を読む。

次に「代わりに何を使うのか」を調べる。

最後に「今すぐ直すべきか」を判断する。

この3段階で考えましょう。

まとめ

EclipseのSpring Boot開発で廃止メソッドの警告が出るのは、主に「@Deprecatedが付いた古いAPIを使っているとき」です。

Javaでは、@Deprecatedが付いた要素を通常のコードから使うと、コンパイラが警告を出します。Eclipseはその警告をエディタ上やProblemsビューに表示してくれます。

ポイント内容
廃止メソッド警告の意味今後は使わないほうがよいAPIを使っている
すぐエラーになるか警告だけなら動くことが多い
なぜ出るか古いAPI、古い教材、バージョンアップ、将来削除予定APIを使っているため
どう調べるか警告文、Javadoc、代替API、公式ドキュメントを見る
どう対応するか基本は新しいAPIへ置き換える

一言でまとめるなら、廃止メソッド警告は「今は動くけれど、将来のために新しい書き方へ移行しましょう」というお知らせです。

新人エンジニアは、警告を見たらすぐに怖がる必要はありません。

でも、無視し続けてもいけません。

まず警告文を読み、メソッドのJavadocを見て、代替メソッドを探しましょう。

今後の学習では、@Deprecated、Javadoc、EclipseのProblemsビュー、Spring BootのAPIドキュメント、バージョンアップ時の移行ガイドを順番に学ぶとよいです。警告は敵ではありません。未来の自分を助けるメッセージだと思って、丁寧に読んでください!

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。