【问题标题】:Spring MVC and handler methods with POJOsSpring MVC 和带有 POJO 的处理程序方法
【发布时间】:2011-07-08 15:51:14
【问题描述】:

Spring MVC 允许定义 handler methods with a variety of parameters 并填充适当的值。

是否可以使用相同的方法将值填充到 POJO 中,然后传递给处理程序方法?

目前,我必须做的:

@RequestMapping
public ModelMap handle( @RequestParam("user") String user, ... )

我想做的事:

class HandlerPojo {
    @RequestParam("user") String user;
    ...
}

@RequestMapping
public ModelMap handle( HandlerPojo pojo )

【问题讨论】:

    标签: spring servlets spring-mvc pojo


    【解决方案1】:

    您链接到的文档说:

    带注释的处理程序方法 与@RequestMapping 可以有非常 灵活的签名。 [...]

    • 命令或 将参数绑定到的表单对象:as bean 属性或字段,带有 可定制的类型转换 [...]

    您不能像在示例中那样在 POJO 的属性/字段上使用 @RequestMapping 注释,但是如果 POJO 的属性名称映射参数名称,则 POJO 将由 Spring 正确实例化和填充.

    【讨论】:

    • +1 我真的很喜欢你的回答,但由于我的问题往往比普通用户更复杂,我认为从长远来看,Tomasz 的回答会稍微有用一些。
    【解决方案2】:

    它实际上非常简单,即使在 POJO 中没有任何 Spring @RequestParam 注释。您正在寻找的是自定义WebArgumentResolver。这是一个完整的例子:

    @Service
    public class UserArgumentResolver implements WebArgumentResolver {
        @Override
        public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
            if (methodParameter.getParameterType() == User.class) {
                return new User(webRequest.getParameter("user"));
            }
            return WebArgumentResolver.UNRESOLVED;
        }
    }
    

    代码相当不言自明:如果处理程序参数之一是User 类型,则检索名为user 的请求参数并返回您想要的任何内容(当然它应该可以分配给UserWebArgumentResolver.UNRESOLVED表示解析器无法处理此参数,应检查后续解析器。

    很遗憾resolver默认没有被选中,必须注册:

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="customArgumentResolver" ref="userArgumentResolver"/>
    </bean>
    
    <mvc:annotation-driven />
    

    就是这样!您的处理程序现在看起来像这样:

    @RequestMapping
    public void handle(User user) {
        //...
    }
    

    【讨论】:

      【解决方案3】:

      这是不可能的,@RequestMapping 正在提取请求中指定的参数并将它们的值分配给 java 变量。您不能在请求中传递 pojo,因为客户端上不存在 pojo。也许看看传回一些 json 并使用 jackson 或 gson 将其反序列化为 pojo。

      【讨论】:

      • -1:不正确,Spring 将根据 POJO bean 属性的名称绑定到 POJO。请参阅@JB 的回答。
      猜你喜欢
      • 2011-08-03
      • 2011-11-09
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 2019-03-28
      • 2018-03-20
      • 1970-01-01
      相关资源
      最近更新 更多