2017-02-21 5 views
2

例えば、ログイン確認のためにチェックする必要がある機能がたくさんあるとします。コードの最初のブロックは、すべてのサービスコールの一番上に存在するが、それはreturn文が含まれているので、私は別の関数にそれをラップする方法がわからないということ別の関数内の関数の検証をどのようにラップしますか?

public Response createThing(){ 
    if(!validLogin(httpRequest, uriInfo)){ 
     return Response.status(Response.Status.FORBIDDEN); 
    } 

    //Do the function 
} 

:まず、それはのようになります。私はいくつかのパターンや規則がそこに人々が使用することがあります確信している

public Response createThing(){ 
    validateLogin(httpRequest, uriInfo); 

    //Do the function 
} 

または

public Response createThing(){ 
    //Implied check somehow? 

    //Do the function 
} 

:私は、次のような何かをしたいと思います。ありがとう。

+0

このJavaEEのですか?このためにフィルタを使用します。私は一般的なパターンは "フィルタを傍受する"と呼ばれると考えています – puhlen

+0

あなたの検証メソッドによってスローされ、ラッパーメソッドで処理される例外としてそれを処理することは大丈夫でしょうか?カスタム例外がありますか? – Rhayene

+0

この特定のケースでは、はい、JavaEEですが、同様の基礎となる呼び出しについても同様の質問があります(入力がnullでないことの検証など)。私は傍受フィルターを見ていますが、ありがとうございます。 – GuitarStrum

答えて

2

から始めると、Java 8の機能はファーストクラスの市民とみなされます。これにより、これまでにない方法でコードを再利用することができます。あなたは、以下に示すように、固定部分と可変部分を含むテンプレートメソッドを作成することができます

public <T,U,R extends Response> R doSomething(final BiFunction<T,U,R> funct,T input1,U input2){ 
    if(validLogin(input1, input2)) {//fixed part 
    return funct.apply(input1,input2);//variable part 
    } 
} 
+0

これは有望そうです。私はこれを見なければならない、ありがとう。 – GuitarStrum

-2
public Response validateLogin(){ 
    if(!validLogin(httpRequest, uriInfo)){ 
     return Response.status(Response.Status.FORBIDDEN); 
    } 
    return Responce.status(Response.Status.OK) 
} 


public Response createThing(){ 
    if(!validateLogin().equals(Response.status(Response.Status.OK)){ 
     return Response.status(Response.Status.FORBIDDEN); 
    } 

    //Do the function 
} 
+0

それでも、私は他のものの中で構造的に同じ問題に戻ってきます。 createThing()の最初の3行は引き続き複製されます。 – GuitarStrum

0

あなたはAOP、アスペクト指向プログラミングを使用することができます。

AspectJまたはSpringを使用すると、コード内の設定されたポイントの前後に適用される「アドバイス」を定義できます。例えば

@Before("createThing(httpRequest, uriInfo)") 
public void validate(HttpRequest request, UriInfo uriInfo) { 
    if(!valid(request,uriInfo)) { 
      throw new InvalidCreateThingException(); 
    } 
} 

これは、あなたがやや複雑指定することです@Aroundアドバイスを、使用している場合は特に、非常に強力かつ柔軟であるが、この方法の入力にすることができます両方のフックを意味し、その出力に影響を与える。ワイルドカードを使用してAOPアドバイスを設定することができるので、一致するオブジェクト/メソッドに適用されます。

AOPを使用すると、多くの春の「魔法」が達成されます。 SpringとAspectJの両方が良いドキュメントを提供しています。

関連する問題