Dodawanie i wyświetlanie listy przez Spring Boota

0

Cześć,
Mam zadanko aby dodawać aby wyświetlać listę jako JSON w springboocie oraz drugie żeby dodawać do tej listy użytkowników przez wprowadzenie w przeglądarce odpowiednich parametrów.

  • utwórz wewnątrz klasy prywatne pole z użytkownikami typu Map<Integer, UserEntity>
  • pobrać listę użytkowników jako JSON - mapping /users
  • pobrać jednego użytkownika jako JSON - mapping /users/{id}/get np. /users/123/get

Klasę UserEntity już mam i wydaje mi sieże w niej wszystko jest ok.
Wyświetlanie wszystkich elementów również działa ( nie wiem czy jest dobrze zrobione ale działa)
Nie działa mi dodawanie.
Przeszukałem kilka stron ale nic nie mogę znaleźć. Jakieśpomysły?

   @RequestMapping("/users/all")
    @ResponseBody
    public Object getApiUser2() {
        List<UserEntity> users = new ArrayList<>();
        users.add(new UserEntity(1L, "Tom"));
        users.add(new UserEntity(2L, "John"));
        users.add(new UserEntity(3L, "Adam"));
        users.add(new UserEntity(4L, "Nicko"));
        users.add(new UserEntity(5L, "Stive"));
        users.add(new UserEntity(6L, "Brayan"));
        return users;
    }

    @RequestMapping("/users/{id}/{name}/get")
    @ResponseBody
    public Object getApiUser2(
            @PathVariable long id,
            @PathVariable String name

    ) {
        return users.add(new UserEntity(id, name));;

    }

0
Trol00311 napisał(a):

Klasę UserEntity już mam i wydaje mi sieże w niej wszystko jest ok.

Nie powiedział bym. Gdzie masz spełniony punkt:

  • utwórz wewnątrz klasy prywatne pole z użytkownikami typu Map<Integer, UserEntity>

?

Dodatkowo masz na sztywno wpisanych jakiś użytkowników, po co?
Zmienna users jest zdefioniowana lokalnie w metodzie, a nie w obiekcie.

0

@KamilAdam: Myślałem że lista z użyciem UserEntity będzie git :/

A jeżeli chodzi o

  • utwórz wewnątrz klasy prywatne pole z użytkownikami typu Map<Integer, UserEntity>

private Map<Integer, UserEntity> mapUser = new HashMap<>();

czy takie coś myślisz że będzie dobre?

Jeżeli widzisz to inaczej to czy mógłbyś mnie nakierować?

0
Trol00311 napisał(a):

private Map<Integer, UserEntity> mapUser = new HashMap<>();

czy takie coś myślisz że będzie dobre?

Tak, to będzie dobre

0

@KamilAdam:
W takim wypadku wyświetlanie wygląda tak

private Map<Integer, UserEntity> mapUser = new HashMap<Integer, UserEntity>();

@RequestMapping("/users/all")
@ResponseBody
public Object getUsers(){
    return mapUser;
    }

natomiast dodawanie mi nie działa :/

@RequestMapping("/users/{id}/{name}/get")
@ResponseBody
public Object getAddUsers(
        @PathVariable Integer id,
        @RequestParam UserEntity name
) {
    return mapUser.put(id, name);
}

wyrzuca mi
screenshot-20220404210906.png
Jakieś pomysły co może być źle?

1

Chyba nie do końca zrozumiałes polecenie. Miałeś mieć mapę z użytkownikami a nie tworzyc ich w kontrolerze:

@RestController
public class MainController{
    private final Map<Integer,UserEntity> users = Map.of(1,new UserEntity("Tom"), 2, new UserEntity("John"))

    @GetMapping("/users/all")
    public ResponseEntity<Collection<UserEntity>> getApiUser2() {
        return ResponseEntity.ok(users.values());
    }

    @GetMapping("/users/{id}/get")
    public ResponseEntity<UserEntity> getApiUser2(
            @PathVariable("id") int id,

    ) {
        return ResponseEntity.of(Optional.ofNullable(users.get(id));
    }
0

@Shalom: Czy taka wersja też moze być? Niby działa ale wolę się upewnić :)

private final Map<Integer, UserEntity> mapUser = Map.of(1, new UserEntity(1L, "Tom"), 2, new UserEntity(2L, "John"));

//wyświetlanie wszytskich
@RequestMapping("/users/all")
@ResponseBody
public Object getUsers() {
    return mapUser;
}

//Wyświetlanie pojedyńcze
@RequestMapping("/users/{id}/get")
@ResponseBody
public Object getAddUsers(
        @PathVariable("id") int id
) {
    return mapUser.get(id);
}

A co do czytania to faktycznie mój błąd ponieważ zadanie ma dalszy ciąg z usunięciem wybranego użytkownika po id: /users/123/remove
oraz dodaniem użytkownika: /user/add?name=John&age=23

Próbuje teraz usunąć ale moja prosta kombinacja

@RequestMapping("/users/{id}/remove")
@ResponseBody
public Object getRemoveUsers(
@PathVariable("id") int id
) {
return mapUser.remove(id);
}

niestety nie działa :/ Jakaś podpowiedź?

0
  1. Miałes zwrócic listę użytkowników a nie mapę ale to szczegół.
  2. Ale co to znaczy "nie działa"? Na oko ten remove wygląda dobrze, chociaż ja bym to jednak robił za pomocą DELETE albo POST a nie GETem.
  3. Serio, oducz sie używania "Object" bo to sprawia ze kompilator nie może ci pomóc jesli typy się gdzieś nie zgadzają. Czemu nie używasz właściwych typów?
0

@Shalom:

  1. Okej to myślę jest najmniejszy mój problem jeżeli chodzi o to zadanie ale warto trzymać się treści zadań to poprawię to :)

2 Sorki nie dodał się screen.
screenshot-20220404214432.png
3. Krótko mam do czynienia z Javą/Spring bootem i object pokazał nam wykładowca. Nawet nie wiedziałem że jest opcja inaczej a teraz już kwestia przyzwyczajenia :)

0

Aaa dobra już wiem w czym rzecz, mea culpa to troche z mojej winy :P Map.of() tworzy immutable map i nie da się jej zmienić wiec .remove() wali wyjątkiem :D Zrób new HashMap<>(Map.of(1, new UserEntity(1L, "Tom"), 2, new UserEntity(2L, "John"))); i będzie ok

0

@Shalom:
Próbuje zrobić ostatnie zadanie jakie mam czyli

  1. dodać nowego użytkownika - mapping /user/add np. /user/add?name=John&age=23 Wynikiem dodawania może być przypisane id do użytkownika lub JSON dodanego użytkownika.
    @RequestMapping("/test2?{name}")
    @ResponseBody
    public ResponseEntity<UserEntity> getAddUsers(
            @RequestParam("name") String name,
            @RequestParam("age") int age

    ) {
        return ResponseEntity.of(Optional.ofNullable(mapUser.put(name)));
        //return ResponseEntity.of(Optional.ofNullable(mapUser.put(age,name)));
    }

Przygotowałem taki kod, Wiem że ten w komentarzu jest zły bo age to nie id. Czy istnieje jakaś opcja coś w stylu auto numerowania?
A druga sprawa to gdy age wezmę jako id (dla testu np) wyrzuca mi name jako string i zmienia mi wszędzie "<UserEntity>" na String. jakiś pomysł?

0
  1. ?{name} co to niby jest? Szczególnie że nie masz nigdzie w argumentach żadnego @PathVariable
  2. Nie za bardzo, ale możesz sobie zrobić jakiś AtomicInteger to używać go do pobierania inkrementalnie kolejnych numerków
  3. Nie bardzo rozumiem pytanie
0

Ogarniasz w ogóle co się dzieje w tym kodzie? xD w którym miejscu tworzysz użytkownika?

Autonumeracji nie ma, możesz samodzielnie generować id, np. tak:

int sequence = 0;
//…
user.setId(sequence++);
0
    @RequestMapping("/test2?{name}")
    @ResponseBody
    public ResponseEntity<UserEntity> getAddUsers(
            @RequestParam("name") String name,
            @RequestParam("age") int age

    )

Nie musisz mapować RequestParam w RequestMapping tj. ?{name} bo kolejność nie ma znaczenia.
W PathVariable tak bo kolejność ma znaczenie.

0

@Shalom:
Przy takim kodzie wyskakuje mi taki błąd
screenshot-20220407154415.png

screenshot-20220407154446.png
Sorki za moją niewiedzę ale za dużo podstaw z tego nie mieliśmy i robię wszystko na czuja

0

No bo ten kod nie ma sensu :D Nie da się przekazać złożonego obiektu jako PathVariable bo niby jak on by miał wyglądać? Ty chcesz tu mieć faktycznie te ReqestParam albo ewentualnie pchasz jsona w body POSTa. Jeśli masz ReqestParam to każde pole musi być osobno, więc name, age, numer buta wszystko to musi być osobno i potem request będzie jakimś /users/add?name=x&age=1&cośtam=cośtam

3

Wroc sie dwa kroki do tylu i zrozum co chcesz zrobic i co sie wgl dzieje. Poczytaj dokumentacje annotacji ktore uzywasz na dobry poczatek
Wstawiasz na pałe jakies annotacje itd liczac ze magicznie to zadziała.

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