2014-04-08 8 views
16

Przenoszę aplikację Spring jsp do Thymeleaf, ale mam problem z wyświetlaniem błędów formularza.Nie wyświetlają się komunikaty o błędach w formie Spring

Używam SpringTemplateEngine i ThymeleafViewResolver i renderowanie szablonów działa. Również wartości formularzy są wypełniane w polach wprowadzania formularzy.

Jedyne, co do tej pory nie działa, to wyświetlanie komunikatów o błędach w formie.

Mój kontroler wygląda następująco:

@RequestMapping(method = RequestMethod.POST) 
String save(@Valid CustomerForm form, BindingResult bindingResult, Model model, RedirectAttributes redirectAttributes) { 
    if (bindingResult.hasErrors()) { 
     model.addAttribute("form", form) 
     return "app/customers/create" 
    } 
    .... 

I drukowane bindingResult celu sprawdzenia zawiera ona błąd:

binding result = org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'customerForm' on field 'name': rejected value []; codes [customerForm.name.NotBlank,name.NotBlank,java.lang.String.NotBlank,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [customerForm.name,name]; arguments []; default message [name]]; default message [may not be empty] 

gdy próbuję wyświetlić błąd za pomocą:

<ul> 
    <li th:each="e : ${#fields.detailedErrors()}" th:class="${e.global}? globalerr : fielderr"> 
     <span th:text="${e.global}? '*' : ${e.fieldName}">The field name</span> | 
     <span th:text="${e.message}">The error message</span> 
    </li> 
</ul> 

to nie wyświetla żadnego błędu.

Próbowałem różnych alternatyw, jak udokumentowano na http://www.thymeleaf.org/doc/html/Thymeleaf-Spring3.html#validation-and-error-messages, ale bez powodzenia.

Czy brakuje mi czegoś?

EDIT

Uwaga Próbuję wyświetlić błąd w formie określonej przez th: obiektu:

 <form id="customer-form" action="#" th:action="@{/app/customers}" th:object="${form}" method="post" class="form-horizontal"> 

      <ul> 
       <li th:each="e : ${#fields.detailedErrors()}" th:class="${e.global}? globalerr : fielderr"> 
        <span th:text="${e.global}? '*' : ${e.fieldName}">The field name</span> | 
        <span th:text="${e.message}">The error message</span> 
       </li> 
      </ul> 
+0

Czy w tagu 'form' umieściłeś tag" ul "z błędami? Sprawdziłem to za pomocą mojego kodu, a gdy jest zawarte z elementem "formularza", działa dobrze, inaczej - nie. –

+0

Dzięki Rafał, próbuję wyświetlić błędy w zestawie formularza za pomocą th: object. Zaktualizowałem pytanie, aby to odzwierciedlić. –

+0

Mój kod był nieco inny, ale działa idealnie. Różnica w moim kodzie polega na tym, że nie zapełniam formularza z powrotem do modelu jawnie ('model.addAttribute (" formularz ", formularz)'), ponieważ jest on automatycznie dodawany. Od dawien dawna zawsze oznaczam parametr wejściowy nie tylko za pomocą "@ Valid", ale także za pomocą "@ ModelAttribute". Może mógłbyś spróbować. –

Odpowiedz

35

myślę, że może być o ten sam problem jak ja - proszę zobaczyć: http://forum.thymeleaf.org/Fields-object-functions-Spring-td3302513.html

tam to zostanie odebrane przez Daniel Fernandez. Zasadniczo obiekt formularza - th: object = "$ {form}" ma nazwę "formularz" ALE kontroler szuka - "customerForm" (nazwa klasy) - nie "formularz" (nazwa zmiennej)

może zostać zmieniona z @ModelAttribute ("dane")

skopiowane z linkujące - stosowanie -

public String post(@Valid FormData formData, BindingResult result, Model model){ 
    // th:object="${formData}" 
} 

--lub--

public String post(@Valid @ModelAttribute("data") FormData data, BindingResult result, Model model){ 
    // th:object="${data}" 
} 
+3

Tak, @ModelAttribute ("formularz") załatwił sprawę. Dzięki! –

12

to jak to zrobić w moich postaciach:

Aby wyświetlić wszystkie błędy, umieściłem to na początku mojego formularza:

<div class="alert alert-danger" th:if="${#fields.hasErrors('*')}"> 
    <p th:each="err : ${#fields.errors('*')}" th:text="${err}"></p>  
</div> 

i do indywidualnego błędu dodam ten po polu (oczywiście, zmieniając pole w hasErrors odpowiadać polu testowane):

<p th:if="${#fields.hasErrors('vehicle.licensePlate')}" class="label label-danger" th:errors="*{vehicle.licensePlate}">Incorrect LP</p> 

Daj mi znać, jeśli działa to dla Ciebie?

+0

To właśnie tego szukałem. –

0

dodanie do @Blejzer odpowiedź: nazewnictwo komunikatu o błędzie w wiadomościach.Plik właściwości muszą przestrzegać poniżej nazewnictwo, więc wiadomość ciąg zostanie zwrócony zamiast klawisza wiadomości:

(ograniczenie Name) (nazwa obiektu) (nazwa obiektu)

uwaga:.. Obiekt nie nazwa klasy Imię

na przykład, jeśli masz poniżej klasy User:

class User{ 
    @NotBlank 
    String username; 

    @Length(min=6) 
    String password; 
} 

przypuszczam w sterowniku, nazwaliśmy obiekt pod walidacji "użytkownik”, patrz @ModelAttribute ("Użytkownik"):

@RequestMapping(value = "/signup", method = RequestMethod.POST) 
public String signup(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, Model model) { 

    if (bindingResult.hasErrors()) { 
     return "signup"; 
    } 

    //do some processing 

    return "redirect:/index"; 
} 

w powyższym fragmencie kontrolera, nazwa obiektu jest "użytkownik" nie "Użytkownik"

Teraz, aby wyświetlić wiadomości niestandardowe, musisz nazwać wiadomość jak poniżej:

NotBlank.user.username=User Name is blank 
Length.user.password=Password length must be at least 6 letters