2017-11-15 3 views
0

Webアプリケーションでは、多くのRESTサービスがあります。突然、各要求の中で1つのオブジェクトを変更する必要があることがわかりました。 それでは、nの異なるコントローラとRESTサービスがあるとしましょう。各コントローラでは、次のレイヤからサービスを呼び出す前に、リクエスト内のオブジェクトを変更する必要があります。各Webサービス呼び出しのオブジェクトの変更

質問はコントローラ内で何百もの変更を加えることなくこれを達成する方法です...これを行う簡単な方法はありますか?

UPDATE:私は、最初の例のように別のオブジェクトの内側にあるか、第二の選択肢のように単独で存在可能性があるあなたが見ることができるように、オブジェクトの詳細をmodiftする必要があり、各コントローラで

@RestController 
public class OrderController { 

    @Autowired 
    private OrderService orderService; 

    @RequestMapping(path = "/order", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) 
    public OrderResponse getOrderData(@RequestHeader HttpHeaders httpHeaders, 
      @RequestBody OrderDataRequest orderDataRequest) { 

     // Use here interceptor to modify the object Details 
     // (inside OrderDataRequest) before below call: 
     OrderResponse resp = orderService.getOrderData(orderDataRequest); 

     return resp; 
    } 

    @RequestMapping(path = "/cancel/{orderId}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) 
    public boolean cancelOrder(@RequestHeader HttpHeaders httpHeaders, 
      @RequestBody Details details, @PathVariable Integer orderId) { 

     // Use here interceptor to modify object Details before below call: 
     return orderService.cancelOrder(details, orderId); 
    } 
} 

答えて

0

interceptorを書くことをお勧めします。これは、あなたが望むことを可能にします。

また、AOPを使用することもできます。しかし、これは非常に複雑すぎると思います。

EDIT: 他のいくつかのリンク:

EDIT 2: その後、(exemple用)そのクラスに応じて特定のオブジェクトを編集するためにそのように行く、mykong.com exampleから "前にアドバイスを" フォロー:

package com.your.company; 

import java.lang.reflect.Method; 
import org.springframework.aop.MethodBeforeAdvice; 

public class HijackBeforeMethod implements MethodBeforeAdvice 
{ 
    @Override 
    public void before(Method method, Object[] args, Object target) 
     throws Throwable { 
      for(Object arg : args) { 
       if(com.your.company.OrderDataRequest.class.isAssignableFrom(arg.getClass())) { 
        // update you object here 
       } 
      } 
    } 
} 

からGet response body - Json To Java

+0

私の場合、( "/ *")ですべてのパスパターンをインターセプタレジストリに追加すれば十分でしょうか、それともそれを行うのがベストアイデアではありませんか?基本的に各サービスには私が修正する必要があるオブジェクトが含まれていますが、それは今です。将来的に変更されるかどうかはわかりません...そして、このインターセプタで各リクエストの中でオブジェクトを修正する方法は? – Lui

+0

いいえ...混乱しています...このインターセプタを使用すると、着信要求からオブジェクトの1つを変更し、ビジネスレイヤからメソッドを呼び出す前にこれをどうやって行うのですか?更新された質問で私の例を見てください。 – Lui

+0

コントローラの前で発生するようにインターセプタを設定した場合、要求によってコントローラに到達する前に要求本体にアクセスできます。あなたはここで必要なものを何でもすることができます。生データ(text/json)があることに注意してください。ターゲットを変更するには、アンマーシャリングまたはキーワードを使用してアクセスする必要があるかもしれません。 – Marvin

0

あなたはこれを達成するために春AOPを使用することができます。従来のフィルタを使用する別のオプション。

+0

フィルターを使って良い例を教えてください。 – Lui

+0

私は[このリンク](https://stackoverflow.com/questions/27504696/how-to-change-the-posted-values-with-spring-mvc-interceptor)に従っていますが、それは何らかの理由で機能しません...私はラッパーコンストラクタに達していますが、getParameterメソッドには達していません... – Lui

関連する問題