2009-04-01 14 views
6

Próbuję utworzyć formularz do edycji istniejącego wiersza bazy danych. Używam tagu formularza Spring MVC do automatycznego powiązania html z obiektem do tworzenia formularzy. Wiersz ma wiele do wielu relacji z inną tabelą, którą próbuję reprezentować za pomocą pola wyboru wielokrotnego przy użyciu znacznika form: select;Wiosna formularz MVC: wybierz Tag, wiele wyborów niewiążące poprawnie?

<form:select path="rules"> 
    <form:options items="${bundle.rules}" itemValue="name" itemLabel="name"/> 
</form:select> 

Używam Hibernacja dla wytrwałości więc związek jest reprezentować jako HashSet wewnątrz POJO Bundle.

private Set<Rule> rules = new HashSet<Rule>(0); 

Bez pola wyboru na stronie, obiekt zostanie zaktualizowany do bazy danych poprawnie, jednak z pola wyboru obiekt nie zostanie zaktualizowany do bazy danych i otrzymuję ten błąd w moim dzienniku log4j pamiętać, że ten błąd nie powoduje wyjątku, jest widoczny tylko w dziennikach;

DEBUG org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:256) - Data binding errors: 1 

Zdarza się to niezależnie od tego, czy pomijam Odmówę wyboru pozycji w polu wyboru, cały formularz nie zostanie poprawnie przesłany. Czy ktoś może mi pomóc?

Jestem świadomy How do I bind collection attributes to a form in Spring MVC, który jest podobny do tego pytania, niestety żadna z sugestii nie wydawała się przydatna dla mojego problemu.

+0

Wygląda na to, że część komunikatu o błędzie została odcięta - czy masz więcej błędów? Ślad stosu? –

+0

Cóż, z jakiegoś powodu jego wiadomość znajduje się na poziomie debugowania. W rzeczywistości nie jest to wyjątek. Napisałem błąd podczas wymieniania śladu stosu, poprawię to teraz. –

Odpowiedz

8

Problem polega na przesłaniu formularza. Spring nie jest w stanie powiązać obiektu polecenia, więc nie przesyła formularza, ale zamiast tego przekierowuje cię do formularza.

Gdy wiązanie z powodzeniem wykonywane, będzie zamiast zobaczyć tę wiadomość:

No errors -> processing submit 

Aby rozwiązać problem, trzeba będzie zarejestrować CustomCollectionEditor z kontrolerem. (Zobacz ten link). Byłoby coś takiego:

protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception 
{ 
    binder.registerCustomEditor(Set.class, "rules", new CustomCollectionEditor(Set.class) 
    { 
    protected Object convertElement(Object element) 
    { 
     String name = ""; 

     if (element instanceof String) 
      name = (String) element; 

     return name != null ? new Rule(name) : null; 
    } 
    }); 
} 
+0

Dzięki, niestety nie mogę uzyskać wordpressa z pracy. Jeśli możesz dodać więcej szczegółów, byłbym wdzięczny. –

+0

To jest to, co musiałem zrobić. Po zaimplementowaniu fragmentu kodu wszystko działało. Czy możesz polecić dobre źródło nauki dla Spring MVC? Czytałem dokumentację/tutoriale na SpringSource.org i kupiłem książkę Spring In Action, ale żadna z nich nie jest potrzebna. –