在开发我们的应用程序的过程中,我们发现自己在控制器中执行了类似的操作:
@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
来电只会在一个地方。
提前致谢。
答案 0 :(得分:1)
看起来像是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);
}
}