-
Spring 2.5 mvc 嵌套对象的数据绑定问题10
最近用spring 2.5 MVC,碰到个如下问题,查找很多资料,都没有得到好的解决方法。
Spring mvc在构造复杂嵌套对象的时候,如何处理?比如:
Role.java
class Role {
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
User.java
class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name= name;
}
}
在role编辑视图页面上可能会是这样:
<input type="text" name="users[0].name" value="aa">
<input type="text" name="users[1].name" value="bb">
<input type="text" name="users[2].name" value="cc">
...
提交该页面,在spring mvc的action拿不到上面的值,因为在运行action之前,spring mvc会去绑定role的
属性值,会根据反射调用role的public List<User> getUsers()方法,但当调用Role的getUsers()方法的时
候,users里面对象的User是null,所以会报出如下错误:
Invalid property 'users[0]' of bean class [User.java]: Cannot access indexed value of
property referenced in indexed property path 'users[0]': returned null
这是自定义对象中含有List的情况,还有种情况就是如果Role改成如下方式,假设role和user是一对一的。
Role.java
class Role {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
在role编辑视图页面上可能会是这样:
<input type="text" name="user.name" value="aa">
这样,提交的时候,也会报错误,嵌套的空指针异常的错误,也就是在绑定页面的值的时候,spring mvc根据反射
得到public User getUser() 方法,然后invoke该方法,此时user是null,所以返回null,后台就报嵌套的空指针异常的错误了。
这个问题,一直困扰我很久了,我找了很多相关资料,都没有找到好的解决方法,请问应该如何解决?
是不是哪里可以配置,spring mvc绑定数据的时候,可以自动初始化?
问题补充小疯子 写道Spring进行嵌套绑定的前提是嵌套的对象不能为空,在配置bean的时候也是这样的, 因此要在绑定这前初始化好这个对象:
public class AccountFormController extends SimpleFormController {
protected Object formBackingObject(HttpServletRequest request) throws Exception {
Role role = new Role();
role.setUser(new User());
return role;
}
}
数组的情况可以自行测试!
我用的annotation方式的,如果这样,是不是action里面
@ModelAttribute("role")
public void populateRole() {
Role role = new Role();
role.setUser(new User());
return role;
}
但是这样,只要调用RoleAction的任何一个方法,都会执行这段代码,还有如果是
List的情况,无法预知页面提交的List的长度。
@ModelAttribute("role")
public void populateRole() {
Role role = new Role();
List<User> users = new ArrayList<User>();
users.add(new User());??应该add多少个呢?怎么获取页面user有多少?
return role;
}
2009年4月13日 14:31
4个答案 按时间排序 按投票排序
-
首先,页面上不会这样显示的
在role编辑视图页面上可能会是这样:
<input type="text" name="users[0].name" value="aa">
<input type="text" name="users[1].name" value="bb">
<input type="text" name="users[2].name" value="cc">
最多全显示成这样吧
<input type="text" name="users.name" value="aa">
<input type="text" name="users.name" value="bb">
<input type="text" name="users.name" value="cc">
Spring 不会处理类型为一对一或者一对多的情况,你要定义一个编辑器给Spring
public class RoleEditor extends PropertyEditorSupport { public RoleEditor(RoleService roleService){ this.roleService = roleService; } //setAsText(String text) //根据你页面上传的值,如果不是数据库的查找的 //你可以this.setValue(new User(name))的操作 @Override public void setAsText(String text) throws IllegalArgumentException { this.setValue(roleService._get(Integer.parseInt(text))); } private RoleService roleService; }
当然最后要注册给Spring 喇public class WebBindingInitializerEx implements WebBindingInitializer { public void initBinder(WebDataBinder binder, WebRequest request) { SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor( dateFormat, true)); binder.registerCustomEditor(User.class, new UserEditor(userService)); binder.registerCustomEditor(UserGroup.class, new UserGroupEditor( userGroupService)); binder.registerCustomEditor(Role.class, new RoleEditor(roleService)); binder.registerCustomEditor(Menu.class, new MenuEditor(menuService)); } @Autowired private UserService userService; @Autowired private UserGroupService userGroupService; @Autowired private RoleService roleService; @Autowired private MenuService menuService; }
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="webBindingInitializer"> <bean class="com.web.WebBindingInitializerEx" /> </property> </bean>
2009年4月14日 07:56
-
1, 确实是每次调用一个action都会运行,这个地方好像无法避免,看样子这个controller里面只能有一个action
2, 长度的话,你可以预先传入一个request对象,应该可以拿到,你试试:
@ModelAttribute("role")
public void populateRole(HttpServletRequest request) {
....
}
这里面的参数序列和@RequestMapping的参数序列注入应该是一样的(还没有验证,你可以试试!)2009年4月13日 15:16
-
Spring进行嵌套绑定的前提是嵌套的对象不能为空,在配置bean的时候也是这样的, 因此要在绑定这前初始化好这个对象:
public class AccountFormController extends SimpleFormController {
protected Object formBackingObject(HttpServletRequest request) throws Exception {
Role role = new Role();
role.setUser(new User());
return role;
}
}
数组的情况可以自行测试!2009年4月13日 14:31
相关推荐
数据绑定是Spring MVC提供的一种机制,它允许开发者自动将用户的输入值映射到Java对象(通常称为模型对象)的属性上,反之亦然。这种映射过程消除了手动转换数据类型的需要,使得处理HTTP请求变得更加便捷。当用户...
Webflow与Spring MVC的结合使得可以利用Spring的依赖注入、AOP和数据访问功能。 - Webflow通过`ControllerAdapters`将Flow与Spring MVC控制器关联,从而实现HTTP请求到Flow状态的映射。 3. **Webflow的优势** - *...
本文将深入探讨Spring MVC支持的四种主要参数绑定方式:基本数据类型、包装类型、自定义对象类型以及自定义复合对象类型。 1. **基本数据类型绑定**: 当控制器方法的参数是Java的基本数据类型(如int、double等)...
当表单数据复杂,包含嵌套对象或数组时,可以将整个表单数据序列化为JSON字符串,然后在后端通过Jackson库反序列化为List。前端需要额外的JavaScript代码将表单数据转换为JSON,而后端控制器接收JSON字符串并解析。...
Spring 的表单标签库与 Spring Web MVC 集成在一起, 使标签可以使用命令对象(command object)和你的控制器处理的参考数据(reference data)。这样,让 JSP 更易于开发、阅读和维护。 配置 Spring 的表单标签库...
6. **更多注解**:例如,`@InitBinder`用于初始化数据绑定,`@RequestParam`用于从请求中获取参数,`@ModelAttribute`用于将模型属性与请求参数关联。 7. **MessageSource增强**:提供更强大的本地化支持,使应用...
比如User类里有Address类的属性,Spring MVC会根据属性名解析JSON或表单数据,自动填充嵌套的对象。 6. **分页与排序参数**: - 在处理大量数据时,可能需要实现分页和排序功能。可以定义Pageable接口的实现类,...
在Spring MVC框架中,我们通常处理HTTP请求时,会遇到绑定表单数据或者查询参数到Java对象的情况。然而,随着RESTful API的广泛使用,JSON格式的数据交换也变得越来越常见。扩展Spring MVC以支持绑定JSON格式的请求...
Spring MVC提供了DataBinder API,它允许开发者自定义数据绑定规则。例如,可以设置转换器(Converter)和格式化器(Formatter)来处理特定类型的字段,或者添加验证规则(Validator)进行数据校验。 3. **...
在Spring生态中,这个工具可能是Spring Data REST或Spring MVC的一部分,它们都依赖于一个强大的JSON库来支持数据交换。在Java世界里,Jackson是最流行且高效的JSON处理库之一。 描述中提到“转换速度大于jsonArray...
Spring Web MVC 框架是Spring框架的核心组件之一,它为构建基于Java的Web应用程序提供了强大的支持。Spring Web MVC的设计理念是围绕DispatcherServlet展开的,DispatcherServlet作为一个前端控制器,负责接收HTTP...
Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。 Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...
2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言支持 2.6.2. JMX 2.6 .3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 ...
Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。 Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...
在MVC模式中,Spring MVC提供了处理HTTP请求、数据绑定、验证和视图渲染等功能。开发者可以通过定义控制器(Controller)来处理请求,使用Model来存储数据,最后通过View来展示结果。Spring MVC的灵活性使得它可以与...
2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于Annotation的控制器 2.5.4. Spring MVC的表单标签库 2.5.5. 对Tiles 2 支持 2.5.6. 对JSF 1.2支持 2.5.7. JAX-WS支持 2.6. 其他 2.6.1. 动态...
2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...
2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言支持 2.6.2. JMX 2.6.3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring ...
MVVM 设计模式是解决 MVC 设计模式中 Controller 里面的数据展现到页面的过程中需要频繁的进行 DOM 相关操作的问题。MVVM 设计模式包括模型、视图、视图模型三个部分。模型是指数据模型相关代码;视图是指页面标签...
Spring Web Flow依赖于Spring Framework的核心组件,包括Spring Core、Spring Context、Spring Web MVC等,同时还需要Servlet API的支持。此外,对于某些特定功能,如持久化管理,可能还需集成如Hibernate或JPA等...