• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Spring MVC @PathVariable

Object Storage Arubacloud
0 głosów
400 wizyt
pytanie zadane 7 lutego 2020 w Java przez zrealowanydawidos Nowicjusz (160 p.)

Witam, mam problem ze zrozumieniem pewnej rzeczy. Załóżmy, że chcę utworzyć metodę mapującą w kontrolerze formularz do akcji "dodawania" nowego obiektu oraz użyć tego samego formularza do edycji istniejących obiektów, oczywiście mapując obie akcje w tej samej metodzie. Do tego oczywiście chcę używać zmiennych URL.

Przykładowy kod:

    @GetMapping(value ={"/osoba/add" , "/osoba/edit/{id}"})
    public String showForm(Model model, @PathVariable(required = false, value = "id") int id){
            if(id == 0){
                o = new Osoba();
            } else {
                o = OsobaController.lista.stream().filter(g -> g.getId()== id).findFirst().get();
            }
            model.addAttribute("osoba" , o);
        

Kod błędu :

Request processing failed; nested exception is java.lang.IllegalStateException: Optional int parameter 'id' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

 

Czyli po prostu czegoś nie rozumiem bo pomimo required = false, kontroler próbuje odczytać tą zmienna. Mogę to oczywiście rozbić na 2 mapowania, ale nie o to tu chodzi :)

2 odpowiedzi

+2 głosów
odpowiedź 7 lutego 2020 przez Aisekai Nałogowiec (42,190 p.)
Tak jak w podpowiedzi masz wspomniane. Zmień na Integer i obsłuż w przypadku, gdy ktoś nie poda parametru (będzie nullem). Nie zmapujesz nulla na typ prymitywny.
+1 głos
odpowiedź 8 lutego 2020 przez mbabane Szeryf (79,280 p.)

Według mnie nie jest to dobry pomysł, żeby dwie funkcjonalności pchać do jednej metody. Łamie to m.in. pierwszą zasadę SOLID, bo w tym momencie, jeśli będziesz musiał zmienić coś w edycji czy dodawaniu to za to odpowiada jedna metoda, czyli jedna metoda ma dwa powody do zmiany.

Dodatkowo to może spowodować, że w o będzie null, czyli gdzieś później może wystąpić NullPointerException:

 o = OsobaController.lista.stream().filter(g -> g.getId()== id).findFirst().get();

Jeśli rozbijesz to na drugą metodę to można zrobić tak:

OsobaController.lista.stream()
    .filter(g -> g.getId()== id)
    .findFirst()
    .ifPresent(user -> model.addAttribute("osoba", user);

wtedy jest jak to się mówi null-safety. 

Dodatkowo jeśli o jest zmienną klasową to narażasz się na to, że jeśli pójdą dwa requesty na raz to mogą sobie one wzajemnie nadpisywać tą zmienną. Najlepiej, jeśli o będzie zmienną lokalną w metodzie. Miej też na uwadze, że to samo będzie z OsobaController.lista jednak pewnie używasz jej jako "bazy danych" więc się tym na razie nie przejmuj - miej tylko tego świadomość, być może rozwiązaniem tego jest użycie jakiejś kolekcji z pakietu java.util.concurrent.

Podobne pytania

0 głosów
1 odpowiedź 518 wizyt
pytanie zadane 14 października 2021 w Java przez Tajniakkk Użytkownik (600 p.)
+1 głos
1 odpowiedź 443 wizyt
pytanie zadane 14 sierpnia 2021 w Java przez DziQu Początkujący (420 p.)
0 głosów
1 odpowiedź 350 wizyt
pytanie zadane 4 maja 2020 w Java przez scrxts Nowicjusz (150 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...