2

アプリを開発する過程で、コントローラーで次のようなことをしていることに気付きました。

@RequestMapping(value = "foo", method = RequestMethod.POST)
@ResponseBody
public SimpleMasterWidget doStuff(@RequestBody ClientData clientData, ServerData serverData) throws Exception
{
        pushClientDataToServerData(clientData, serverData);
        //stuff specific to this operation on the serverData
        return whatever;
}

呼び出しは、すべてのpushClientDataToServerData(clientData, serverData);POST 要求で複製されます。ここで、clientData を serverData にプッシュする必要がないことは理解していますが、これを強制するレガシー コードがあります。

現在、引数を解決するためにHandlerMethodArgumentResolverインターフェースを実装していServerDataます。重複したすべての呼び出しを削除するには、既にプッシュされている引数で引数pushClientDataToServerDataを解決できるようにしたいと考えています。ServerDataClientData

引数リゾルバーでは、にアクセスできるNativeWebRequestので、おそらくそこからリクエスト本文を取得して、それをデシリアライズすることができます。@RequestBodyただし、Spring が既にアノテーションで行っていることを再実装する必要はありません。

したがって、私の質問はこれに要約されます: 引数リゾルバーで Spring のものを呼び出して、デシリアライズされたClientDataオブジェクトを取得しpushClientDataToServerData、引数リゾルバー内で直接呼び出すことができる方法はありますか? 次に、すべてのコントローラーメソッドは次のようになります。

@RequestMapping(value = "foo", method = RequestMethod.POST)
@ResponseBody
public SimpleMasterWidget doStuff(ServerData serverData) throws Exception
{
        //stuff specific to this operation on the serverData
        return whatever;
}

そして、pushClientDataToServerData呼び出しは 1 か所だけになります。

前もって感謝します。

4

1 に答える 1

0

Spring AOP の有力候補のようです。以下はポイントカットの単なる例です。可能なすべてのメソッドをキャッチするように改善する必要があります。

@Component
@Aspect
public class PushClientDataAspect {

    @Before(value = "execution(* com.xyz.myapp.dao.*.*(..) && args(clientData, serverData) && @annotation(org.springframework.web.bind.annotation.ResponseBody))")
    public void pushClientData(ClientData clientData, ServerData serverData) {
        pushClientDataToServerData(clientData, serverData);
    }   

}
于 2013-05-16T15:20:03.590 に答える