Błąd z którym nie mogę sobie poradzić Spring

0

Dodałem sobie formularz który ma jedno pole do którego można wpisać liczbę z przedziału 2 - 10. Dodałem na to pole walidację i komunikat błędu mam być wyświetlany przy polu. Szukałem w książce jak to ma wyglądać jednak chyba coś skopałem skoro uzyskuje następujący błąd po uruchomieniu:

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/jsps/lift.jsp at line 92

89: </tr>
90:
91: Powtórzenia od 2 do 10:</td>
92: <sf:input path="rep" name="rep" type="int"/>
93: <sf:errors path="rep" cssClass="error"></sf:errors></td>
94: </tr>
95:

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

<sf:form method="post" modelAttribute="vlift">
					<table>
						<tr>
							<td>Powtórzenia od 2 do 10:</td>
							<td><sf:input path="rep" name="rep" type="int"/>
								<sf:errors path="rep" cssClass="error"></sf:errors></td>
						</tr>
						<tr>
							<td></td>
							<td><input value="Oblicz" type="submit" /></td>
						</tr>
					</table>
				</sf:form>
	@RequestMapping(value="/lift", method=RequestMethod.POST)
		public String calculateLift(@Valid ValueLift vlift, BindingResult re){
				
			if(re.hasErrors()){
	            return "lift";
	        }
}
return "lift";
	@RequestMapping(value="/lift", method=RequestMethod.GET)
	public String showLift(Model model){
		return "lift";
	}
@Min(value = 2, message = "Ilość musi być większa lub równa 2!")
	@Max(value = 10, message = "Ilość musi być mniejsza lub równa 10!")
	private int rep;
0

No i gdzie widzisz problem? Przeciez błąd jest dośc jasny.

    @RequestMapping(value="/lift", method=RequestMethod.GET)
    public String showLift(Model model){
        return "lift";
    }

Pokaż mi gdzie wrzucasz do modelu pusty obiekt ValueLift vlift nazwany jako vlift. Co ty myślisz? Że Spring się sam domyśli jakiego typu miałby to być obiekt czy co? Poza tym robisz to strasznie nieelegancko...

    @RequestMapping(value="/lift", method=RequestMethod.GET)
    public ModelAndView showLift(){
        ModelAndView mv = new ModelAndView("lift");
        mv.addObject("vlift", new ValueLift());
        return mv;
    }
0

Ok zmodyfikowałem tę metodę która bierze żądanie GET:

@RequestMapping(value="/lift", method=RequestMethod.GET)
	public ModelAndView showLift(){
		 ModelAndView mv = new ModelAndView("lift");
	        mv.addObject("vlift", new ValueLift());
		return mv;
	}

I tworzenie pustego modelu mam również wrzucić do metody, która obsługuje żądanie POST? I ta metoda ma mi sprawdzać czy nie ma błędów walidacji:

@RequestMapping(value="/lift", method=RequestMethod.POST)
		public ModelAndView calculateLift(@Valid ValueLift vlift, BindingResult re){
				
		ModelAndView mv = new ModelAndView("lift");
        mv.addObject("vlift", new ValueLift());
			if(re.hasErrors()){
	            return mv;
	        }
	
			return mv;
	}

I przy takiej postaci metody komunikatów walidacji mi nie wyświetla :/ Shalom mógłbyś wytłumaczyć mi jak to działa bo nie potrafię tego zrozumieć. Obejrzałem tutoriale w necie i tam w tych metodach tworzony jest tylko model jako parametr metody

Model model

i nic więcej się z nim nie robi i metoda zwraca obiekt String(przekierowanie na stronę)

0

Nie no przecież w przypadku posta to nie ma sensu! Czy ty w ogóle rozumiesz co robisz? Bo mi to wygląda na "random coding". Cośtam skopiujesz, cośtam pozmieniasz i modlisz się zeby zadziałało. Tak się nie da!

@RequestMapping(value="/lift", method=RequestMethod.POST)
        public ModelAndView calculateLift(@Valid @ModelAttribute("vlift") ValueLift vlift, BindingResult re){
          return new ModelAndView("lift");
    }

Obejrzałem tutoriale w necie i tam w tych metodach tworzony jest tylko model jako parametr metody

A patrzyłeś na daty? Obstawiam ze te twoje tutoriale są tak z ~2010 roku i opisują Springa w wersji 2.X

0

Sorki że tak się wtrącę w temat kolegi. Mam pytanko odnośnie walidacji formularzy. Przejrzałem wiele stron odnośnie tworzenia formularzy w spring i wszędzie stosuje się podobną metodykę (nawet w aktualnych tutorialach z bieżącego roku). Mam książkę "Spring w akcji" i tam jest również przedstawione to rozwiązanie. Mówię tu o stosowaniu walidacji hibernate'a. Pytanie tylko czy jeśli chodzi o dobre praktyki w programowaniu jest to odpowiednie podejście? Czy lepiej zrobić to np. przy pomocy JS?

Ps. Pablos, sprawdź czy kontroler przekierowuje Ci do odpowiedniego widoku ponieważ błąd ten wskazuje że brakuje mu pewnego zasobu... Z reguły jest to jak powiedział Shalom widok strony.

0

@eL "walidacja" w JS to żadna walidacja bo można ją wyłączyć albo obejść przez proxy (webscarab) albo modyfikując dane wysyłane z formularza (tamper-data). Stosuje się to tylko żeby od razu pokazać userowi że coś jest nie tak ("walidujemy" jak tylko kontrolka straci focus). Główna walidacja musi zawsze być po stronie serwera.

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