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

Controller Java

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
+1 głos
141 wizyt
pytanie zadane 17 sierpnia 2021 w Java przez Comparion Obywatel (1,810 p.)

Cześć, mam taka klasę do postów:

public class Post {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @NonNull
    private String body;
    @NonNull
    private String town;
    @NonNull
    private String subject;
    @NonNull
    @ManyToOne
    @JoinColumn(nullable = false, name="users_id")
    private User user;

}

Jest ona w relacji z klasa user

@PostMapping("/posts")
public ResponseEntity addPost(@RequestBody Post post){
    return postService.addPost(post);
}
public ResponseEntity addPost(@RequestHeader("username") String username, @RequestBody String postBody){
    return postService.addPost(username, postBody);
}

Stworzyłem sobie kontroler i zastanawiam się jak powinien wyglądac? czy powinien on przesyłać obiekt klasy Post? chyba to trochę bez sensu? przesyłać tak wszystkie pola wraz z hasłem itd. Wystarczyło może by tylko id? Czy takie cos można uzyskać? Czy może ten sposb aby przez @RequestHeader przesyłać  również po prootu oprócz username, subject oraz town?

1 odpowiedź

+1 głos
odpowiedź 17 sierpnia 2021 przez Wiciorny Ekspert (245,390 p.)
wybrane 17 sierpnia 2021 przez Comparion
 
Najlepsza

Nie wiem od czego zacząć. To wszystko zależy od twojej logiki aplikacji i obiektu który przesyłasz.
Masz Controller dedykowany dla Postów "PostController" np, więc generalnie odpowiada on za  kontrolę zasobów URL dla postów, natomiast twój obiekt Post-> jest w relacji z Użytkownikiem który go napisał, okej więc twój obiekt "ma pole User" 

Więc generalnie, nie ma mowy o przysyłaniu haseł,  zresztą takowe są trzymane w hashu. 
Ale żeby napisać post użytkownik np musi być autoryzowany, zarejestrowany. Więc jeśli pisze post, to mamy jego NICK, i np. ID 
Te wartości będą w obiekcie Post dla pola User, nie potrzebujesz nic więcej i wtedy przy odbiorze obiektu Post, wybierasz dane dotyczących User i wykonujesz logikę 
Spójrz na przykłądowe wykorzystanie obiektów z relacjami tutaj https://www.baeldung.com/spring-data-rest-relationships.

JSON w swoim ciele powinien zawierac pole, obiekt user, które ma określone atrybuty np id i nickname. 

 

Druga sprawa, jeżeli napisałeś tak 

public ResponseEntity addPost(@RequestHeader("username") String username, @RequestBody String postBody){
    return postService.addPost(username, postBody);
}

to analizując to, prawdopodobnie "username" jest unikatowe? wtedy w Servisie jak chcesz dokonać jakiś operacji wydobywasz z bazy danych albo własnym QUERY pisząc, albo dostępnym w SRPING Data  obiekt-encje dla User o wskazanym username i wykonujesz to czego Ci potrzeba. 

@RequestHeader -  adnotacja służy do przesyłania nagłówków, patrz dokumentacja. Więc tutaj nie ma mowy o przesyłaniu danych obiektu, to jest wręcz zabronione. Przysłane dane np w twoim wypadku username, to dane do walidacji a nie dotyczące obiektu przesyłanego. 
@RequestBody - służy do przesyłania obiektu 
 

W razie pytań wal śmiało
Na marginesie, masz dane gdyż sam napisałeś  nullable, więc nie ma opcji, aby Post istnial bez usera, wiec i POLE OBIEKTU typu User posiada dane 

@JoinColumn(nullable = false, ...)
 
komentarz 17 sierpnia 2021 przez Comparion Obywatel (1,810 p.)
Wiec może tutaj należy zrobić do wysyłania postów osobną klasę typu "PostRequest", gdzie będą tylko potrzebne mi pola(np id_user), następnie wyszukać odpowiedniego użytkownika i prze mapować?
1
komentarz 17 sierpnia 2021 przez Wiciorny Ekspert (245,390 p.)

Możesz stworzyć dodatkowy obiekt wartości np PostWithUsers ( jako tabele w bazie nawet)

która przechowuje owe wartośći:  id mapowanie np. IdPosta - > IdUser'a.
Nawet to może być osobna tabela, tworzona automatycznie, a dane dostarczane będą przez PostWithUserDTO np, jeśli korzystasz z takiego mechanizmu lub po prostu poprzez brak obiektu wartośći DTO, a normalnie przesyłać Encją z mapperem.

Skorzystać możesz przy RELACJI Z @JOIN-TABLE automatycznie utworzysz powiązania np 

 @JoinTable(name = "POST_USERS",
               joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
               inverseJoinColumns = {@JoinColumn(name = "post_id", referencedColumnName = "id")})

w obiekcie przechowywac jedynie idy np. 

   private Long userId;
    private Long postId;

 

komentarz 17 sierpnia 2021 przez Comparion Obywatel (1,810 p.)
Dziękuje bardzo za odpowiedź
komentarz 17 sierpnia 2021 przez Wiciorny Ekspert (245,390 p.)
Nie ma za co. W tym zakresie jak do brata.
komentarz 17 sierpnia 2021 przez Comparion Obywatel (1,810 p.)

@Wiciorny, ale z takim podejsciem to nie staje się to relacją wiele do wielu?

Podobne pytania

0 głosów
1 odpowiedź 139 wizyt
pytanie zadane 5 kwietnia 2019 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
0 głosów
3 odpowiedzi 898 wizyt
pytanie zadane 2 listopada 2015 w Java przez nowszy94 Bywalec (2,320 p.)
0 głosów
2 odpowiedzi 186 wizyt
pytanie zadane 24 czerwca 2019 w Java przez SztyJkmajster Z Pols Nowicjusz (240 p.)

90,298 zapytań

138,894 odpowiedzi

311,080 komentarzy

60,012 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...