什么是需要做回来 用户对象部门 对象= 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;
}
}
我不确定它是否会这样做,但您可以为“department.name”和“department.description”注册自定义编辑器。在setAsText()方法中的此自定义编辑器中,只在字符串不为空时设置值。所以如果你没有这个元素的更多属性,编辑会阻止在对象上调用setter(我不确定对象是否会在没有属性的情况下被实例化,我认为它不会但我不完全确定)。问题是如果只有一个属性是空的,则空属性将被填充为空。 – Javi 2010-12-16 17:07:52
不幸的是它不起作用。我像这样注册编辑器:dataBinder.registerCustomEditor(Department.class,new DepartmentEditor());并且顺便说一下User对象带有空属性的实例化部门 – eugenn 2010-12-16 21:17:04
您是否在setter上为名称和描述设置了断点(仅仅是为了看到编辑器已经很好的注册并且没有被调用)。另一种方法可能是设置这些输入以在使用JavaScript序列化表单之前禁用,因为在发送表单时禁用的输入不会被发送。 – Javi 2010-12-17 08:15:31