2010-12-16 54 views
5

我有下面的命令对象:Spring MVC的结合

public class User { 
    private Department department; 
    private String firstName; 
    private String lastName; 
    private String login; 
    private String password; 
... 
} 

应该在JSP页面中呈现:

<form:input path="lastName" /> 
<form:input path="department.name"/> 
<form:input path="department.description"/> 

所以,当我用空department.name提交和department.description春自动实例化具有空属性的对象部门。 (请参阅https://jira.springframework.org/browse/SPR-6032我会保持autoGrowNestedPaths = true)

需要做些什么来获取用户对象,其中Department对象= null?

+0

我不确定它是否会这样做,但您可以为“department.name”和“department.description”注册自定义编辑器。在setAsText()方法中的此自定义编辑器中,只在字符串不为空时设置值。所以如果你没有这个元素的更多属性,编辑会阻止在对象上调用setter(我不确定对象是否会在没有属性的情况下被实例化,我认为它不会但我不完全确定)。问题是如果只有一个属性是空的,则空属性将被填充为空。 – Javi 2010-12-16 17:07:52

+0

不幸的是它不起作用。我像这样注册编辑器:dataBinder.registerCustomEditor(Department.class,new DepartmentEditor());并且顺便说一下User对象带有空属性的实例化部门 – eugenn 2010-12-16 21:17:04

+0

您是否在setter上为名称和描述设置了断点(仅仅是为了看到编辑器已经很好的注册并且没有被调用)。另一种方法可能是设置这些输入以在使用JavaScript序列化表单之前禁用,因为在发送表单时禁用的输入不会被发送。 – Javi 2010-12-17 08:15:31

回答

5

什么是需要做回来 用户对象部门 对象= null?

如果您正在寻找控制器特定的解决方案,那么找到所有空的嵌套参数并将这些参数设置为不允许的字段。

@InitBinder(value="user") 
    public void bind(WebDataBinder dataBinder, WebRequest webRequest) { 
     List<String> emptyParams = new ArrayList<String>(); 
     Iterator<String> itr = webRequest.getParameterNames(); 
     while(itr.hasNext()) { 
      String name = itr.next(); 
      if(name.startsWith("department.")) { 
       Object value = webRequest.getParameter(name); 
       if("".equals(value)) { 
        emptyParams.add(name); 
       } 
      } 
     } 
     if(!emptyParams.isEmpty()) { 
      dataBinder.setDisallowedFields(emptyParams.toArray(new String[emptyParams.size()])); 
     } 
    } 

如果你正在寻找一个通用的解决方案创建自定义数据绑定,并删除所有嵌套PARAMS是空的。

public class CustomDataBinder extends ServletRequestDataBinder { 

    @Override 
    protected void doBind(MutablePropertyValues mpvs) { 
     PropertyValue[] pvArray = mpvs.getPropertyValues(); 
     for (PropertyValue pv : pvArray) { 
      boolean nestedProperty = PropertyAccessorUtils.isNestedOrIndexedProperty(pv.getName()); 
      if(nestedProperty && "".equals(pv.getValue())) { 
       mpvs.removePropertyValue(pv); 
      } 
     } 
     super.doBind(mpvs); 
    } 

} 

而要使用CustomDataBinder,您必须具有自定义HandlerAdapter。

public class StandardAnnotationMethodHandlerAdapter extends AnnotationMethodHandlerAdapter { 
    @Override 
    protected ServletRequestDataBinder createBinder(HttpServletRequest request, Object target, String objectName) throws Exception { 
    CustomDataBinder dataBinder = new CustomDataBinder (target, objectName); 
    return dataBinder; 
    } 
}