2010-12-16 5 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)

Что нужно сделать для возврата Пользовательский объект, где объект объекта = null?

+0

Я не уверен, что это будет трюк, но вы можете зарегистрировать собственный редактор для «department.name» и «department.description». В этом настраиваемом редакторе в методе setAsText() устанавливается только значение, когда строка не пуста. Поэтому, если у вас больше нет свойств в этом элементе, редакторы будут препятствовать вызову установщика объекта (я не уверен, что объект не будет создан, даже если на нем не будет заполнено свойство, я думаю, что это не будет, но я не совсем уверен). Проблема заключалась бы в том, что если только одно свойство пусто, пустой атрибут будет заполнен как null. – Javi 2010-12-16 17:07:52

ответ

5

Что нужно сделать для возвращения объекта пользователя, где отдел объекта = нуль?

Если вы ищете конкретное решение для контроллера, то найдите все пустые вложенные параметры и установите эти параметры как запрещенные поля.

@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; 
    } 
} 
Смежные вопросы