Spring - przekazywanie parametru do kontrolera

0

Potrzebuję przekazać wartość do kontrolera z poziomu HTML'a, jednak cały czas dostaję error:

freemarker.template.TemplateModelException: Method public org.springframework.web.servlet.support.BindStatus org.springframework.web.servlet.support.RequestContext.getBindStatus(java.lang.String) throws java.lang.IllegalStateException threw an exception when invoked on org.springframework.web.servlet.support.RequestContext@6bed32f3 with arguments of types [java.lang.String,]

Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'workPosition' available as request attribute

Głównie chodzi o to, że użytkownik podaje jakąś wartość do input'a na stronie, ta wartość jest przekazywana do kontrolera i tam już na jej podstawie jest zwracany wynik. Jednak wysypuje się to po wejściu na stronę i wyświetlany jest powyższy błąd.

Kod kontrolera i html'a:

@Controller
public class AdminController
{
    @Inject
    private PersonEntityDao personDao;
    private ModelAndView mav;


    @RequestMapping( value = "/admin", method = RequestMethod.GET )
    public String displayAdminPage()
    {
        return "admin";
    }

    @RequestMapping( value = "/findPerson", method = RequestMethod.POST )
    public ModelAndView findByWorkPosition( @RequestParam( "workPosition" ) String workPosition )
    {
        this.mav = new ModelAndView( "people" );
        if ( workPosition != null )
        {
            final List< PersonEntity > people = this.personDao.getAll().stream().filter( p -> p.getWorkPosition() == workPosition ).collect( Collectors.toList() );
            this.mav.addObject( "peopleByWorkPosition", people );
        }

        return this.mav;

    }
}
<html>
<body>
    <form action="/add" method="post">
        <@spring.formInput "workPosition" />
        <input type="submit" value="Wyślij"/>
    </form>

</body>
</html>

Moje pytanie to - jak to zrobić poprawnie? ;)

0

Ale gdzie masz akcje dla /add ? bo ja widzę tylko dla /findPerson i /admin

p -> p.getWorkPosition() == workPosition

serio ?

0

Zamiast /add, powinno być /findPerson, racja ale to nic nie zmienia.

0

Ale jaki jest błąd ? nie możliwe jest że dla /add i /findPerson dostajesz takie same błędy.

Zrobiłem u siebie, działa:

    //wystawiam formatke
    @RequestMapping(value ="/test", method = RequestMethod.GET)
    public String TestGet(Model model){
        return "test";
    }

    //przyjmuje parametr test, wrzucam go do mapy model.
    @RequestMapping(value ="/test", method = RequestMethod.POST)
    public String TestPost(Model model, @RequestParam("test") String test){
        model.addAttribute("output", test);
        return "test";
    }

i formatka, w biednym html'u

        //////////
        ${output}
        /////////
        <form name="input" action="" method="post">
        Username: <input type="text" name="test">
        <input type="submit" value="Submit">
        </form>
0

Dostaję taki błąd jaki opisałem w 1 poście, tutaj wrzucam go jeszcze raz. W samej metodzie findByWorkPosition zmieniłem tylko sposób porównywania stringów.

HTML:

<html>
<body>
    <form action="/findPerson" method="post">
        <@spring.formInput "workPosition" />
        <input type="submit" value="Wyślij"/>
    </form>

</body>
</html>

Błąd:

freemarker.template.TemplateModelException: Method public org.springframework.web.servlet.support.BindStatus org.springframework.web.servlet.support.RequestContext.getBindStatus(java.lang.String) throws java.lang.IllegalStateException threw an exception when invoked on org.springframework.web.servlet.support.RequestContext@6387f445 with arguments of types [java.lang.String,]
	...
Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'workPosition' available as request attribute
	at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
	at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:867)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:483)
	at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:836)
	at freemarker.ext.beans.OverloadedMethodModel.exec(OverloadedMethodModel.java:104)
	... 64 more
0

Dobra, posługując się Twoim to naprawiłem. Bład był z freemarkerem i fragmentem <@spring.formInput "workPosition" />.

0

błąd nie z freemarkerem a raczej z modelem z którego korzystałeś. A był to po prostu String, nie wiem czy w takiej formie to przeszłoby.

0

Rozumiem, a możesz wyjaśnić dlaczego ten model był błędny? Czy nie warto korzystać i zwracać obiektów ModelAndView, tylko przyjmować jako parametr Model i na nim działać?

0

Tzn. chodziło mi o

@RequestParam( "workPosition" ) String workPosition

Oczekiwales zwyklego stringa jako parametr więc zwykłego inputa trzeba było użyć.

https://svn.apache.org/repos/asf/qpid/tags/pre-M1/java/java/management/core/lib/spring/spring.ftl

formInput

Display a form input field of type 'text' and bind it to an attribute
of a command or bean.

lepiej zadziałałoby z @ModelAttribute i jakąś prostą klasą, gdzie workPosition byłoby jej właściwością.

Poczytaj, nie czuje się ekspertem, zwłaszcza, że sam nie tak dawno zacząłem ogarniać Springa i FreeMarkera :)

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