2010-12-16 10 views
5

Mam następujący obiekt polecenia:Wiosna MVC wiążących

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

które powinny być świadczone na stronie jsp:

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

więc kiedy złożyć z pustym department.name i department.description Wiosna auto-tworzenie instancji obiektu z pustymi właściwościami. (Patrz: https://jira.springframework.org/browse/SPR-6032 Chciałbym zachować AutoGrowNestedPaths = true)

Co trzeba zrobić, aby odzyskać obiekt użytkownika, w którym obiekt Department = null?

+0

Nie jestem pewien, czy to by wystarczyło, ale można zarejestrować niestandardowy edytor zarówno dla "depart.name" i "department.description". W tym edytorze niestandardowym w metodzie setAsText() ustawiaj wartość tylko wtedy, gdy ciąg nie jest pusty. Więc jeśli nie masz więcej właściwości na tym elemencie, redaktorzy nie będą mogli wywołać obiektu ustawiającego na obiekcie (co nie jest pewne, czy obiekt nie zostanie utworzony, nawet jeśli nie zostanie na nim wypełniona właściwość, myślę, że to nie będę, ale nie jestem całkowicie pewien). Problem polegałby na tym, że jeśli tylko jedna właściwość jest pusta, pusty atrybut zostanie wypełniony jako null. – Javi

+0

Niestety to nie działa. Zarejestrowałem edytora w ten sposób: dataBinder.registerCustomEditor (Department.class, new DepartmentEditor()); a przy okazji obiekt User jest dostarczany z instancjonowanym działem z pustymi atrybutami – eugenn

+0

Ustawiłeś punkty przerwania na setterach dla nazwy i opisu (żeby zobaczyć, że edytor jest dobrze zarejestrowany i nie są wywoływane). Innym sposobem wyjścia może być ustawienie tych wejść do wyłączenia przed serializacją formularza za pomocą javascript, ponieważ zablokowane dane wejściowe nie będą wysyłane podczas wysyłania formularza. – Javi

Odpowiedz

5

Co potrzeba do zrobienia dla wracając obiekt użytkownika, gdzie Departament obiekt = null?

Jeśli szukasz rozwiązania określonego kontrolera, znajdź wszystkie puste, zagnieżdżone parametry i ustaw te parametry jako niedozwolone pola.

@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()])); 
     } 
    } 

Jeśli szukasz ogólnego rozwiązania, utwórz niestandardowy segregator danych i usuń wszystkie zagnieżdżone parametry, które są puste.

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); 
    } 

} 

Do użycia CustomDataBinder potrzebny jest niestandardowy 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; 
    } 
}