当前位置: 首页 > 知识库问答 >
问题:

如何在Spring中为REST服务在HandlerInterceptor中填充ModelAndView

陈康胜
2023-03-14

我正在使用Spring框架构建一个REST完整服务。

我需要添加自定义Cookie到响应,在控制器中处理请求后,根据响应类型

@Controller
public class SomeController {

    ...

    @RequestMapping(method = RequestMethod.GET, value = MY_PROFILE, produces = PRODUCES)
    public @ResponseBody Some myProfile(@RequestBody() A a) {
        ...
    }

    ...
}

但是当它到达我的拦截器时

public class SomeIntercepter implements HandlerInterceptor {

    ...

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

    ...

}

ModelAndView为空,我只能处理请求

所以我有两个问题:

  1. 有没有一种方法可以让Spring使用数据填充ModelAndView,而不显式使用HttpServletResponse、HttpEntity或ModelAndView,从而保持控制器的完整性?(我不打算使用ModelAndView添加Cookie,我只需要知道拦截器中的响应对象,并将Cookie添加到HttpServletResponse。)
  2. 我曾考虑使用ThreadLocal解决这个问题,但据我所知,在异步处理的情况下,这将停止。是否有一个经过验证的ThreadLocal解决方案,在我决定切换到异步处理时不会中断

示例用例:

假设我正在进行A/B测试,我的用户界面根据响应中的Cookie呈现不同的效果。我希望有一个地方,根据返回对象,我可以指定这个Cookie。

共有2个答案

程项禹
2023-03-14

当您使用@ResponseBody时,Spring不使用模型,您甚至没有在控制器方法中声明它,而且无论如何它都没有意义。

但您可以始终使用请求属性将数据从控制器传递到拦截器,拦截器将能够在其postHandle方法中使用它来决定如何处理响应和cookie。

孟海
2023-03-14

@ResponseBody的特殊之处在于它告诉Spring响应已经被处理(或者应该用返回值处理)。在这种情况下,不需要ModelAndView,因为没有要渲染的视图。因此MVC堆栈不会创建一个模型和视图,也不会向HandlerInterceptor提供任何模型和视图。基本上,在调用postHandle时,响应已经刷新,您将无法编写任何cookie。而且,在任何情况下,ModelAndView都不是添加cookie的合适位置。HttpServletResponse

 类似资料:
  • 问题内容: 我创建了一个GUI,并在外部获取了一个数据库。我正在NetBeans中使用GUI构建器来执行此操作。有谁知道用来自数据库的值填充jComboBox的简单方法吗?当我运行项目时,没有错误,但组合框保持为空。 这是设置带有折扣名称的组合框的代码: 它位于与jComboBox对象不同的类中。此类称为模型。 这是我以称为DiscountGUIView的形式调用setDiscountNames方

  • 问题内容: 我知道该怎么做,但是我发誓您可以像[[0] = {0,0,0,0};那样填写;你是怎么做到的?我确实尝试过Google,但没有任何帮助。 问题答案: 您也可以将其作为声明的一部分:

  • 问题内容: 有一些简单的方法可以在Java中填充字符串吗? 似乎应该在类似StringUtil的API中使用某些东西,但是我找不到能做到这一点的任何东西。 问题答案: 有几种方法:leftPad,[rightPad](https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/Str

  • 现在,我当前的渲染代码如下: 着色器: 假设我想像JavaAWT一样,成功地填充这个形状。。。我该怎么做?(已经尝试使用GL_多边形,但它只填充整个O,我有一个填充圆,而不是O。也尝试使用jogamp glu的部分,但它只是没有渲染任何东西,不知道为什么)

  • 并希望按列表中的值更改行C1-C3。预期产出:

  • 我有一个简单的JavaFX类,对于这个问题,它的结构是这样的。 BorderPane包含包含FlowPane的StackPane。 几天来,我一直试图让StackPane填充其父级BorderPane,但似乎没有任何效果。最终结果应该是StackPane的背景设置为“红色”。 代码: 我的应用程序正在运行的照片 所以基本上这个左侧区域应该完全填充我的BorderPane的左侧,因此背景应该正确覆盖