Spring MVC 3:定义自己的数据类型绑定

时间:2012-05-09 10:45:19

标签: java spring-mvc

在spring3控制器中我可以创建一个动作方法,其中有几个参数将由spring设置

@RequestMapping(value="/updateTemplate")
public void doStuff(HttpServletRequest request, Locale locale) {
  assert request != null;
  assert locale != null;    
}

如何教Spring填充我自己定义的数据类型?

@RequestMapping(value="/updateTemplate")
public void doStuff(HttpServletRequest request, Locale locale, MyClass myClass) {
  assert myClass != null;
}

2 个答案:

答案 0 :(得分:2)

你应该使用WebArgumentResolver

public class MyClassWebArgumentResolver implements WebArgumentResolver {
    public Object resolveArgument(MethodParameter param, NativeWebRequest req) throws Exception {
        if (param.getParameterType().equals(MyClass.class)) {
            MyCLass obj = new MyClass();
            ....
            return obj;
        }
        return UNRESOLVED;
    }

} 

并将其注册到springmvc:

<mvc:annotation-driven >
    <mvc:argument-resolvers>
       <bean class="com.xxx.MyClassWebArgumentResolver" />
    </mvc:argument-resolvers>
</mvc:annotation-driven>

然后你可以在你的控制器中使用它

@RequestMapping(value="/updateTemplate")
public void doStuff(HttpServletRequest request, Locale locale, MyClass myClass) {
    assert myClass != null;
}

答案 1 :(得分:0)

Spring有一个名为HttpMessageConverter的类,它将为您做到这一点。它将使用传入的HttpServletRequest的各个成员并使用它们来创建一个对象,然后将其传递给您的Controller方法。最好的部分是,如果您将HttpMessageConverter添加到ApplicationContext(通过AnnotationMethodHandlerAdapter,描述为here),它会自动为您执行此操作。

已经存在许多预先构建的实现,您可以在上面链接的HttpMessageConverter页面上找到很多实现。可能最常用的是MappingJacksonHttpMessageConverter,用于将JSONObject从请求主体映射到JavaBean,MarshallingHttpMessageConverter,用于将XML从请求主体映射到JavaBean。