java - Spring MVC 使用 Get 请求绑定(bind)命令对象

标签 java spring spring-mvc

我需要实现一个 Controller ,该 Controller 具有一个命令对象,该对象支持用于跨多个条目搜索的过滤表单。

问题是,我被要求在不使用 POST 请求的情况下执行此操作,而是仅使用 GET 请求,然后就失去了 springs 为我们提供的默认数据绑定(bind)的功能。

所以我尝试在我的 Controller 内部实现一个方法,如下所示:

@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
        throws Exception {
    if (isSearchRequest(request)) {
        MyCommandObject myCommandObject = (MyCommandObject) getCommand(request);
        System.out.println(managePositionsForm);
    }
    return super.handleRequestInternal(request, response);
}

但是 getCommand 返回一个没有值的全新 CommandObject,尽管这些值存在于请求对象中(我可以使用 HttpServletRequest 的 getParameter 方法检索)。但没有任何绑定(bind)。

所以问题:

1)有什么办法可以存档吗?

2)同样非常重要的是,表单中的所有值都会丢失,最终(如果这个问题解决了)我将需要“保留”用户的过滤器,以避免在首先搜索。

  • 自动响应:setSessionForm(true);看起来可以做这个工作! (根据javadoc)

谢谢大家!

问候

维克多。

最佳答案

好吧,我找到了一种方法来归档 a 正在寻找的内容。

为了那些以前有同样问题的人,我会解释一下,并希望找到一个有经验的用户来验证这个方法......一些安静的共同点是有多种方法可以做同样的事情,并且作为人类是非常如果没有正确确认正确的路径,很难知道......所以这是我在 AbstractFormController 内部发现的(用 javadoc 很好地记录了)。

所以我所做的如下,在我的 Controller 构造函数中,我在末尾添加了这些行:

    setSessionForm(true);
    setBindOnNewForm(true);

这就是魔法!

但是 setSessionForm(true) 还不够。根据 javadoc,setBindOnNewForm(boolean) 方法执行以下操作:

/**
 * Set if request parameters should be bound to the form object
 * in case of a non-submitting request, i.e. a new form.
 */

所以我的猜测是这两个标志必须标记为 true,因为:

  • setSessionForm 可以将表单对象存储为 session 属性,因此“存储在 session 中以在请求之间保留表单对象实例,而不是在每个请求上创建一个新的实例”(根据 setSessionForm 的 javadoc方法)。
  • setBindOnNewForm 允许使用初始请求填充表单对象(无论我们有什么类型的请求方法)。根据javadoc发现AbstractFormController “只有当 bindOnNewForm 设置为 true 时,ServletRequestDataBinder 才会应用到用初始请求参数填充新的表单对象...”

但我仍然注意到,使用调试器跟踪 Controller 流程,填充发生在方法“getErrorsForNewForm(HttpServletRequest request)”内。这就是使用 ServletRequestDataBinder 类型的具体对象的地方 IF setBindOnNewForm 为 true,然后(如 javadoc 所述)调用 onBindOnNewForm 方法,允许程序员用自定义行为覆盖它,默认行为只是空(再次针对 AbstractFormController 的代码进行了双重检查)。

我有一种强烈的感觉想要验证我的想法,所以如果有人能帮助我,那就好了,而且问题已经解决了!

提前感谢大家!

问候。

关于java - Spring MVC 使用 Get 请求绑定(bind)命令对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22391323/

相关文章:

java - 有没有办法在没有 org.bson.types.ObjectId 的情况下使用 Mongo/Morphia ?

java - GridLayout 没有填满整个窗口

java - 如何设置冗余 MongoDB 模板?

java - 在 Spring MVC Controller 中获取查询字符串值

java - 在 Spring 3.0.3 中使用 Velocity 工具

Java-如何在不扩展比较器的情况下对包含句点/点的字符串数组进行排序?

Java 在 JPanel 内声明serialVersionUID 时出错

Spring Boot 加载所有可用的属性文件,无论我的 @TestPropertySource 注释如何

java - 使用 azure.keyvault.secret.property-sources 时 Spring Boot 应用程序启动失败并丢失日志

java - Spring MockMvc - 请求参数列表