2012-02-09 11 views
0

データのビットが欠落している場合に、アーカイブデータの大量インポート後にoccuronally nullポインタ例外がスローされた後、一連のpdfレポートクラスがあります。 thing.getOtherThing().getText();にはOtherThingがなく、レポートは転記されます。Spring AOPを使用するメソッドでnullポインタ例外を傍受することはできますか?

私はそれを見ると、我々はいくつかのオプション

  1. を持っているデータを修正 - それほど明確ではないデータはすべてのケースであるべきと人間の判断の問題であるいくつかのケースでは
  2. PUTが/してみてくださいどこでもキャッチし、ユーザまでのバブルに役立つ例外再スロー - どこでも
  3. ユーザーに仕事と醜いコードの多くが、便利を入れてnullをチェック - 合体/ NVLで操作を行うためのDAOコードには何のおかげ
  4. 作業欠落しているフィールド(または銀行)にN/Aを含むレポートを生成し、クエリを生成するs) - 大丈夫だが役に立たない

または...ここでAOPで何かできますか?特定のクラス/メソッドでスローされたnullpointersを傍受することは可能ですか?これらが傍受されたときに利用可能な情報のレベルは?この方法では複数の場所がnullポインタを投げることができることに注意してください:(

感謝。

+0

AOPは魔法と似ています。 このリンクに従ってくださいhttp://stackoverflow.com/questions/7637512/spring-aop-configuration-for-intercepting-all-exceptions – mishadoff

+0

注 - 'thing'がspring beanでない限り、aspectjコンパイルまたはロード時織り(Spring AOPプロキシではない)。必ずしもあなたのソリューションを支持するとは限りません。 – pap

答えて

2

UFF ...それは痛みを伴うかもしれないが、私は心からあなたのコードtgrough行くとヌルのためにチェックを入れて、あなたをお勧めしますどこが

MyUtilityHelper.checkNotNull (toCheck, elegantMessage)

ような何かを行うと、そのメソッドを使用すると、詳細な情報を持つことができる何かを投げることができますので、自分のためのユーティリティクラスを構築し、賢明である。

AOPがされ実際には当てはまりませんIMHO、あなたはシーケンシャルロジックで行われるはずのAOPとは関係ありません。なぜなら、コードはシーケンシャル処理の方が優れているからです... AOPは、機能の水平レイヤセキュリティのように、ロギング...

+0

簡単に追加することができ、簡単に削除できます...そして、私はそれをやっている人ではありません:) – blank

+0

水平機能ではなく例外を処理する方法は?説明された方法で特にNPEを投げることは、私にとってはかなり水平に聞こえる。 – sloven

2

AOPは潜在的にソリューションに到達するのに役立ちますが、例外によって例外がスローされる前にアクションを実行する必要があります。まず、thing.getOtherThing.getText()と書いたときに、奇数の名前のフィールドまたは偶然にかっこを省略したメソッド呼び出しのgetOtherThingが書かれていますか?後者の場合は、Spring AOPを使用してメソッドをインターセプトできます(が提供されています。thingは実際にはBeanです)。もしそうでなければ、Spring AOPは(実装方法のせいで)フィールドアクセスの傍受をしないので、完全なAspectJが必要になります。

アイデアは、あなたがポイントカットを定義するために@Aroundを使用して、このようなアドバイス持っていることです:AspectJの持つ

static final OtherThing THE_DEFAULT_VALUE = ...; 

@Around("execution(* getOtherThing())") 
public Object supplyDefault(ProceedingJoinPoint pjp) throws Throwable { 
    Object result = pjp.proceed(); 
    if (result == null) 
     result = THE_DEFAULT_VALUE; 
    return result; 
} 

または、(未テストを、私は実際には何のためにAspectJを使用していませんでした):

aspect ADefaultOtherThing { 
    static final OtherThing THE_DEFAULT_VALUE = ...; 

    OtherThing around(): get(OtherThing getOtherThing) { 
     OtherThing result = proceed(); 
     if (result == null) 
      result = THE_DEFAULT_VALUE; 
     return result; 
    } 
} 

まだ、これはAOPの使用が特に良いかどうかは疑問です。確かにそのようなビジネスロジックをコードに直接組み込む方が良いでしょうか?フィールドが決してnullでないことを保証するには、良い不変式のように見えます。

+0

SpringAOPの例はメソッド呼び出し用であり、AspectJの例はフィールドアクセス用の例であることに注意してください。 –

+0

私は誤ってメソッド名からかっこを削除しました。 – blank

+0

その後、SpringAOPの "around" adviceがそれを行います。これは良い考えか、ビジネスオブジェクトが明示的にnullを返さなければならないかどうかを判断するだけです。 –

関連する問題