Walidacja formularza - Spring + Freemarker

0

Chciałbym zrobić walidację pól na klasie Book. Mam tak:

Book.java

@Size(min = 8, max = 12)
private String isbn;

Kontroler:

@RequestMapping("/saveBook")
	public ModelAndView saveBookData(@RequestParam("author_id") int authorId, @Valid @ModelAttribute("book") Book book,
			BindingResult result) {
		if (result.hasErrors()) {
			LOG.info("ERRORS IN FORM");
			return new ModelAndView("redirect:/bookAction.html?bookAdd", result.getModel());
		}
...

Formularz w FTL (sam początek, żeby sprawdzić czy coś wyłapuje):

<#include "layout.ftl"/>
<@spring.bind "book"/>
<@spring.showErrors '*', 'errors' />

<#if spring.status.error>
    <div class="errors">
        There were problems with the data you entered:
        <ul>
            <#list spring.status.errorMessages as error>
                <li>${error}</li>
            </#list>
        </ul>
    </div>
<#else>
    <div class="errors">
        There are no errors.
    </div>
</#if>

Skutek jest taki, że na formularza zawsze jest wyświetlane:

There are no errors.

ale już na konsoli:

INFO - ERRORS IN FORM

Ktoś orientuje się gdzie tu brakuje powiązania? Na necie brak kompletnego przykładu na spring + ftl, tylko snippety z problemami.

2

No bo robisz redirecta, nie rób przy errorze to będziesz miał go w modelu.

0

Ok, teraz dostaję error z walidacji pola (więc połowa sukcesu), ale też freemarker pluje, że nie dostał obiektu model:

following has evaluated to null or missing: ==> model [in template "newBook.ftl" at line 55, column 63]

Zarówno jak dam:

return new ModelAndView("newBook","book", book);

jak i

return new ModelAndView("newBook", result.getModel());

W tej linijce jest odwołanie do makra, które pobiera autorów:

<@authorsMacro "authors" model.authors/>

Normalnie w tym kontrolerze tak jest tworzony ModelAndView:

@RequestMapping(value = "/bookAction", params = "bookAdd")
	public ModelAndView getBookAddForm(@ModelAttribute("book") Book book, BindingResult result) {

		List<Author> authors = new ArrayList<Author>();
		authors = authorService.findAll();

		Map<String, Object> model = new HashMap<String, Object>();
		model.put("authors", authors);

		return new ModelAndView("newBook", "model", model);
	}

Ok, nie wiem na ile to jest w zgodzie ze sztuką, ale dałem tak i zatrybiło:

if (result.hasErrors()) {
			LOG.info("ERRORS IN FORM");
			Map<String, Object> model = new HashMap<String, Object>();
			model.put("authors", getAuthors());
			return new ModelAndView("newBook", "model", model);
		}

Dajcie znać jeśli to jest słabe rozwiązanie ;)

0

Rozumiesz o co chodzi? ModelAndView("newBook", "model", model); znaczy że na widoku newBook będziesz miał dostępny obiekt model po nazwą "model", więc nic dziwnego że jak dajesz ModelAndView("newBook","book", book); to nie widzi Ci modelu a tym bardziej authors w nim.

0

Tak, rozumiem i już naprawiłem - edit.

1 użytkowników online, w tym zalogowanych: 0, gości: 1