4

次のようなコードがあるとします。

Vehicle vehicle = vehicleRepostory.findByIdInitialized(vehicleId);

Vehicleが見つからない場合、このメソッドはを返しnullます。仕様によると、この場合MyObjectNotFoundException、コードは次のようになるようにスローする必要があります。

Vehicle vehicle = vehicleRepostory.findByIdInitialized(vehicleId);
MyObjectNotFoundException.throwIfNull(vehicle, Vehicle.class, vehicleId);

への呼び出しを削除したい場合はどうすればよいですかthrowIfNull。それは実際には乾燥しておらず、とにかく貧弱な設計の選択です。私には知られていないデザインパターンがあるに違いありません。ウェブで検索しましたが、実際に使えるものは何も見つかりませんでした。

簡単な解決策は、コードをリポジトリに配置することかもしれませんが、これにはSpringDataを使用しているため、単なるインターフェイスです。

public interface VehicleRepository extends Repository<Vehicle, Long>

// ...

@Query("select v from Vehicle v LEFT JOIN FETCH v.technicalData td LEFT JOIN FETCH v.registrationData rd"
    + " where v.vehicleId = ?")
Vehicle findByIdInitialized(Long vehicleId);
4

7 に答える 7

3

基本的に、リポジトリでこれをサポートする必要があるようです。

Vehicle vehicle = vehicleRepository.loadExisting(vehicleId);

loadExistingここで、との違いはfindByIdInitialized、前者はエンティティが存在することを期待し、存在しない場合は例外をスローすることです。

このようにして、すべてのリポジトリクライアントは、ルックアップを実行するときに、エンティティがないために例外が発生するかどうかを判断できます。IDによるすべてのルックアップで例外がスローされる場合もあります。その場合は、単一のメソッドに戻ることができます。

編集:リポジトリが自動生成される場合、私は3つのアプローチのいずれかを取ります:

  • 包んでください
  • それを拡張する
  • ジェネレータを変更する

これらの選択のどれが最も適切であるかは、正確な詳細に依存します。

于 2013-02-22T09:44:57.587 に答える
0

Javaで@NotNullアノテーションを調べることができます。それにはいくつかのフレーバーがあり、コンパイル時に検証を行うものと、実行時に検証を行うものがあります。一部のエディター(IntelliJ IDEAなど)は、NPEが発生する可能性のある操作を実行しているときに警告を表示する場合があります。

どの@NotNullJavaアノテーションを使用する必要がありますか? !=nullステートメントの回避 http://docs.oracle.com/javaee/6/api/javax/validation/constraints/NotNull.html

于 2013-02-22T09:43:39.617 に答える
0

もちろん、必要な例外をスローするようにリポジトリ自体を再設計できれば最高です。それがなければ、動作にパッチを当てる回避策が必要です。

1つのアプローチはリフレクションです。文字列としてrepository受け取り、リフレクティブに呼び出すメソッドでへの呼び出しをラップします。findByIdInitializedその後、メソッドは適切な例外をスローできます。

別の方法は、同じことを行うためにいくつかのAOPを関与させることですが、おそらくより多くの型安全性を備えています。

于 2013-02-22T09:44:52.433 に答える
0

null許容パラメーターをfindByIdInitializedに追加することをお勧めします。これは、次のようになります。

Vehicle findByIdInitialized(int vehicleId, boolean throwException) {
   // implementation behavior...

   if (throwException) {
       MyObjectNotFoundException.throwIfNull(vehicle, Vehicle.class, vehicleId);
   }
}
于 2013-02-22T09:47:00.063 に答える
0

これを使って:

import static java.util.Objects.requireNonNull;

.
.
.

Object o = requireNonNull(obj);
于 2013-02-22T09:47:49.460 に答える
0

nullをインターセプトして例外をスローするAOPアドバイスを「メソッドが返した後」にしたいようです。

于 2013-02-22T09:48:41.893 に答える
-2

NullObject設計パターンを使用できますが、例外をスローするIMHOが最良の選択です。

DRYを維持するには、そのスローインを入れる必要がありますfindbyIdInitialized

于 2013-02-22T09:42:56.740 に答える