【问题标题】:Spring form commandName = session attributeSpring form commandName = session 属性
【发布时间】:2015-04-13 12:43:58
【问题描述】:

我有许多页面具有相同的表单,我使用 commandName 绑定我的对象。我尝试将对象放入名为“myObject”的会话并将其用于表单(commandName =“myObject”)。但是系统抛出异常(对于 bean 名称“myObject”,BindingResult 和普通目标对象都没有)。 如何将对象绑定到任何控制器和请求的会话?

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    当您使用form:form 标记定位请求中不可用的命令对象时,该错误很常见。

    一个好的方法是将@ModelAttribute带注释的方法与@SessionAttributes结合在一个控制器上,该控制器最初转发到包含表单的视图,类似于

    @Controller
    @SessionAttributes("myObject")
    public class FormController {
    
        @ModelAttribute("myObject")
        public MyObject createMyObjectBean() {
            return new MyObject();
        }
        ...
    }
    

    最初的createMyObjectBean 将在对控制器方法的第一个请求中调用,但不会在后续请求中调用,因为myObject 值将来自会话,因为@SessionAttributes

    请注意,要使这种方法起作用,您必须有一个控制器来转发到包含您的表单的视图

    【讨论】:

    • 只有当我的请求通过带有 @SessionAttributes 注释的控制器中的方法解决时才有效,但是当请求通过其他控制器解决时我有同样的问题。如何将我的对象用于所有控制器中的所有请求?
    • 您可以使用示例控制器作为父级,并让所有其他控制器从它扩展
    • 感谢重播,但在我的情况下,我决定将对象放在会话中并使用 jstl 渲染到 jsp 中。为了从请求中获取,我使用 ModelAttribute。我认为这是更简单的方法。
    • 如果不想使用继承也可以使用ControllerAdvice
    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2016-09-17
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多