gpt4 book ai didi

java - 我如何挂接到 Spring 的 @RequestBody 参数解析以使用请求的主体解析我自己的参数

转载 作者:行者123 更新时间:2023-11-29 09:02:26 24 4
gpt4 key购买 nike

在开发我们的应用程序的过程中,我们发现自己在我们的 Controller 中做了这样的事情:

@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 参数的接口(interface)。要删除所有重复的 pushClientDataToServerData 调用,我希望能够使用已插入其中的 ClientData 解析 ServerData 参数。

现在在参数解析器中,我可以访问 NativeWebRequest,所以我可能可以通过那里获取请求主体并将其反序列化等等。但是,我不想用 @RequestBody 注释重新实现 Spring 已经在做的事情。

所以我的问题归结为:有没有一种方法可以在参数解析器中调用 Spring 的东西,以便我可以获得反序列化的 ClientData 对象并调用 pushClientDataToServerData 就在参数解析器中?然后所有的 Controller 方法看起来像这样:

@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 调用只会在一个地方进行。

提前致谢。

最佳答案

看起来很适合 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);
}

}

关于java - 我如何挂接到 Spring 的 @RequestBody 参数解析以使用请求的主体解析我自己的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com