gpt4 book ai didi

java - HandlerInterceptorAdapter,响应的JSON编码和后处理

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:30:32 37 4
gpt4 key购买 nike

之前的设计

我有一个如下构建的 Spring Controller :

@RequestMapping(value = "/rest/funf/{datatype}", method = RequestMethod.GET)
public ModelAndView getFunfData(@PathVariable("datatype") String dataType,
WebRequest request) throws HttpException {

我还有一个执行预处理和后处理(根据策略修改返回的模型)的 HandlerInterceptorAdapter。后处理处理程序的签名如下

@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {

实际上效果很好。 REST API 返回了结构不佳的 JSON 负载,但至少拦截器(策略执行点)能够从模型中匿名化(剥离用户个人数据)并替换它。

重点是,在旧设计中,我能够在将响应发送到输出之前检索响应,修改并将其重新注入(inject)到 ModelAndView 实例中。为简洁起见,无需发布代码。

新设计

现在我发现了一种新设计,可以帮助我克服响应结构中的缺陷。

当我 return new ModelAndView(jacksonView_instance, "data", dataToConvertToJson) 时,它的结构如下

{
"data": {
"myAttr1":"myVal1"
}
}

当接收程序想要将有效负载转换为 JSON 时,这很糟糕。于是我发现

@RequestMapping(value = "/rest/funf/{datatype}", method = RequestMethod.GET, produces = { "application/json" })
public @ResponseBody
Object[] getFunfData(@PathVariable("datatype") String dataType,
WebRequest request) throws HttpException {

这个简化了代码,最重要的是使响应结构良好,比如

{
"myAttr1":"myVal1"
}

这对于 REST 设计契约来说完全没问题,但是

问题

现在 HandlerInterceptor 将无法再检索模型,因此无法检索我从我的 API 返回的对象(这是一个与 FUNF 相关的 API,用于处理记录在移动设备上的个人数据,甚至是敏感数据)。

所以如果我需要匿名化记录,我不能像以前那样在拦截器中做到这一点

解决方法

我知道我可以终止拦截器并在 API 中执行策略执行,但这不是一个好的设计,即使 PEP 在 preHandle 中执行授权并在postHandle 目前是一个自动实例化的 Spring 对象。在处理多个 API 以及中期更改/扩展 PEP 实现的可能性时,在 API 中复制和粘贴代码不是一个好主意。

总之,先把上下文解释清楚再提出一个直题

问题是

给定一个通用的 Spring MVC API,该 API 返回一个由内容协商器处理的对象

@RequestMapping(value = "/path/{variable}", method = RequestMethod.GET)
public @ResponseBody Object api() {

我如何拦截在外部类中返回的对象以对其进行修改? (例如,替换为要返回给客户端的新对象实例)

最佳答案

看起来这在 Spring MVC 中是不可能的。我刚刚在调试 session 中看到了代码。

当您使用 ModelAndView 时,Spring MVC 将 MaV 存储在一个变量中,该变量一直存在到 postHandle ,然后写入响应主体。

相反,当您使用 @ResponseBody 并返回值时,该值将在调用周期中直接处理,使用 MessageConverter 写入响应。

由于响应是单向网络流,因此拦截它为时已晚。

解决方案应基于与处理程序不同的方法,例如直接应用于 Controller 方法的 AOP 拦截器

关于java - HandlerInterceptorAdapter,响应的JSON编码和后处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14705787/

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