【问题标题】:How do I map properties of a ModelAttribute?如何映射 ModelAttribute 的属性?
【发布时间】:2012-04-01 19:00:44
【问题描述】:

我有一个类似的请求映射

@RequestMapping(value = "/path", method = RequestMethod.POST)
public ModelAndView createNewItem(@ModelAttribute PostRequest request)

并且 PostRequest 具有一些属性,例如userName (getUserName()/setUserName()) 但客户端发送的参数如user_name=foo 而不是userName=foo。是否有注释或自定义映射拦截器来执行此操作而无需放置所有这些丑陋的setUser_name() 方法?

由于这种情况经常发生(我必须实现一个所有内容都使用下划线的 API),因此在实现上付出一些努力是可以接受的。

【问题讨论】:

标签: java spring-mvc modelattribute


【解决方案1】:

为什么不使用 Spring 的表单标签库呢? http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/view.html#view-jsp-formtaglib

标签库(结合您的控制器)自动映射您的 ModelAttribute。在对表单执行 GET 请求时,您会创建 PostRequest 的新(可能是空的)对象并将其粘贴到模型中。发布表单后,spring 会为您提供带有表单值的 ModelAttribute。

示意图示例:

控制器:

@RequestMapping(value="/path", method = RequestMethod.GET)
public String initForm(ModelMap model) {

        PostRequest pr = new PostRequest();
        model.addAttribute("command", pr);

        return "[viewname]";
    }

@RequestMapping(value="/path", method = RequestMethod.POST)
public ModelAndView postForm(
        @ModelAttribute("command") PostRequest postRequest) {

        // postRequest should now contain the form values
        logger.debug("username: " + postRequest.getUsername());

        return "[viewname]";
     }

jsp:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<form:form method="post" enctype="utf8">
    Username: <form:input path="username" />
   <br/>
   <%-- ... --%>
   <input type="submit" value="Submit"/>
</form:form>

【讨论】:

  • Sping 表单标签库在这种情况下可能无济于事,因为原始海报提到了一个随意的客户端,它使用下划线即user_name=foo 而不是userName=foo 发送参数。在您的情况下,您需要控制客户端 (JSP)。
  • 哦,好吧 - 我不是那样读的。控制 ViewController 而不是 View 本身有点奇怪!?
  • 在我的例子中,我必须基于现有规范实现一个 REST API,因为客户端已经在野外。也没有 HTML 视图,但响应会根据客户端的接受标头自动映射。
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
相关资源
最近更新 更多