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调用,我希望能够使用已经推入其中的参数来解决该ServerData参数。ClientData

现在在参数解析器中,我可以访问,NativeWebRequest所以我可以通过那里获取请求主体并反序列化它等等。但是,我不想重新实现 Spring 已经对@RequestBody注释进行的操作。

所以我的问题归结为:有没有一种方法可以在参数解析器中调用 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电话只会在一个地方进行。

提前致谢。

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 回答