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

Controller Java

VPS Starter Arubacloud
+1 głos
211 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 (269,120 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 (269,120 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 (269,120 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ź 166 wizyt
pytanie zadane 5 kwietnia 2019 w Java przez Piotr Kusnierkiewicz Użytkownik (670 p.)
0 głosów
3 odpowiedzi 1,265 wizyt
pytanie zadane 2 listopada 2015 w Java przez nowszy94 Bywalec (2,320 p.)
0 głosów
2 odpowiedzi 227 wizyt
pytanie zadane 24 czerwca 2019 w Java przez SztyJkmajster Z Pols Nowicjusz (240 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...