Jeśli podobają Ci się moje filmy, to zostaw łapkę w górę i za subskrybuj mój kanał. Zapraszam Cię także do zapoznania się z moimi kursami i warsztatami: 🟢 Kurs Hibernate i JPA - kursy.nullpointerexception.pl/hibernate/ 🟠 Warsztat Architektura Heksagonalna - kursy.nullpointerexception.pl/product/warsztat-architektura-heksagonalna/ 🟢 Kurs Testy Jednostkowe - kursy.nullpointerexception.pl/testy-jednostkowe/ 🟠 Warsztat Architektura Warstwowa - kursy.nullpointerexception.pl/product/warsztat-architektura-warstwowa/
Fajny materiał :) Co do wstrzykiwania przez konstruktor to warto byłoby też wspomnieć w skrócie (lub też odesłać do innej lektury) czemu lepiej używać wstrzykiwania przez konstruktor niż jego alternatyw. Czekam na kolejne odcinki. Pozdrawiam :)
Cześć Szymon, dzięki za uwagi. Pozwolę sobie wkleić fragment z dokumentacji springa: "The Spring team generally advocates constructor injection, as it lets you implement application components as immutable objects and ensures that required dependencies are not null. Furthermore, constructor-injected components are always returned to the client (calling) code in a fully initialized state. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns." Całość można znaleźć tutaj: docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-collaborators
Zawsze się zastanawiałem kiedy tak faktycznie jest potrzeba używania innego scope niż singleton, jakie to ma przełożenie w realnym projekcie? Dobry materiał.
Trudno podać trafny przykład, dlatego go nie podałem ;) Generalnie można podejść do tego w taki sposób: jak chcesz przechować jakiś stan w beanie, a nie chcesz go współdzielić, to możesz użyć scope prototype. Jeśli robisz to w aplikacji webowej, to możesz skorzystać ze scope request (wtedy masz pewność, że inny użytkownik nie będzie miał dostępu do tego stanu). Ale oczywiście można to osiągnąć w dużo prostszy sposób, nie korzystając z beanów springowych. Po prostu tworzysz jakiś obiekt i zapisujesz w nim stan ;) i przekazujesz go jako parametr w metodach, w których go potrzebujesz.
To może krótki odcinek: 'tutaj mamy apke bez używania beana, a tutaj to samo już z użyciem dependency'. Tak by wykazać dokładnie jakie bonusy daje injection dependency. Po za tym świetny odcinek, powtażam się ale te podejście 'wyjaśnie wszystko co jest underneath the hood' bardzo mi pasuje.
To zamiast wstrzykiwania, używaj wszędzie np. new PostSerwis(). I np. w klasie konfiguracyjnej możesz stworzyć beana @Bean public PostController postController() { return new PostController(new PostService(new PostRepository)); } Chociaż post repository jest interfejsem, wiec tak to nie zadziała. Ale wyglądałoby to mniej więcej tak.
Jedna uwaga. Nie jest prawdą, że trzeba zawsze ustawiać proxyMode przy wstrzykiwaniu beanów ze scopami request, session, prototype. Gdyby tak było nie byłoby to opcją. Jest to wymagane jedynie gdy wstrzykujemy beana o węższym scope do beana o szerszym scope. Przykładowo wstrzykiwanie request do session. Przy wstrzykiwaniu np. request do request lub session do request nie jest to wymagane. Samo proxyMode powoduje utworzenie klasy proxy by zapewnić istnienie zależności w momencie tworzeniu beana o szerszym scope, gdy sam bean zależności nie może zostać stworzony, bo nie istnieje wtedy sesja albo nie został wywołany request. Ten sam problem wystąpi gdy mimo użycia proxy chcemy użyć wstrzykniętej zależności gdy jej scope nie istnieje, np. zależności o scope session gdy nie ma jeszcze utworzonej sesji, wtedy spring rzuci wyjątkiem.
Dzięki za komentarz. Jest tak, jak napisałeś. Użyłem tutaj skrótu myślowego. Jeśli wstrzykniesz bean session, czy request do beana typu singleton, który jest domyślnym typem beana w springu, to będziesz musiał ustawić proxyMode (dokładnie o to mi chodziło).
To co więcej mi przyszło na myśl: wiecej o lombooku kiedy ok kiedy nie hascode z equals w kontekscie lombooka controller vs rest controller interface serwisu rozbudowane api własne zapytania w repo DAO, DTO, repo kiedy co na pewno wiecej o hibernate
Dzięki za komentarz ;) Część rzeczy będzie pojawiać się w kolejnych częściach. Co do Lomboka to może nagram osobny odcinek poświęcony tylko Lombokowi. Jeśli chodzi o Hibernate, to też będzie więcej w kolejnych częściach, ale tak naprawdę to można o nim nagrać osobny kurs ;) Nie wiem, w jakim stopniu w tym kursie będzie pokryty temat Hibernate'a
Cześć mam pytanko, bo chciałbym równocześnie rozwijać swoje restowe-api - najpierw oglądam Twój filmik -> przenoszę wiedzę do swojego projektu. Chciałbym żeby to moje api wystawiało endpointy na zamówienia z produktami w środku, lecz mam zagwozdkę jak to zamapować, jakich encji bym potrzebował. product,order na pewno, ale czy to wystarczy? Z góry dzięki za odpowiedź.
Cześć Grzegorz. To zależy, jak dobrze chcesz to zrobić. Na początek wystarczy Product, Order, OrderItem, ProductCart, Customer, BillingAddress, ShipingAddress. Nie wiem co tam jeszcze. To chyba te podstawowe ;)
W beanach springowych nie używa się raczej kilku konstruktorów. To framework tworzy dla ciebie obiekt (w domyślnej konfiguracji tylko jedne), więc nie potrzebujesz kilku konstruktorów. A jak z jakichś względów chcesz stworzyć sobie dodatkowy konstruktor to pewnie, któryś musisz oznaczyć adnotacją. Nie wiem jak to będzie działać, bo nigdy nie potrzebowałem takiego rozwiązania😉
Seria zapowiada się bardzo dobrze, bardzo jasno tłumaczysz :) Jestem początkująca, trochę koduję (piszę testy automatyczne) i chciałabym stworzyć prostą apkę webową z bazą danych do zarządzania motkami nici i wzorami do haftu (relacja wiele do wielu, plus wszelkie CRUDy). Pomyślałam, że mogłabym stworzyć sobie projekt na githubie, bo wtedy (jeżeli coś z tego wyjdzie :D ), to miałabym też co do pokazania rekruterom :D Mam pytanie, czy jest zrabialne takie coś, żeby zrobić adapter baz danych? Tzn. żeby rekruter mógł sobie odpalić apkę z użyciem H2 i testowymi danymi, a z kolei ja mogłabym lokalnie sobie używać MySql z realnymi danymi? Z góry dziękuję za porady :) Pozdrawiam
Cześć, ciekawy pomysł na aplikację ;) Co do pytania, to teoretycznie jest taka możliwość. Wystarczy, że będziesz uruchamiać projekt z różną konfiguracją, i wczytywać konfigurację w zależności od potrzeb. Można to zrobić używają profili springa: docs.spring.io/spring-boot/docs/1.2.0.M1/reference/html/boot-features-profiles.html i wtedy możesz mieć kilka plików konfiguracyjnych np. application-dev.properties, application-prod.properties docs.spring.io/spring-boot/docs/1.2.0.M1/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties Do tego musisz unikać w aplikacji używania sql, jak będziesz używała JPA to częściowo powinno załatwić sprawę. W części 9 pokazuję jak korzystać z Liquibase to narzędzie do setupowania bazy. Jak w liquibase będziesz używała xml do konfiguracji bazy to całkowicie wyeliminujesz SQL, i będziesz mogła pracować na dwóch bazach na przemiennie, zmieniając tylko aktywny profil w springu. To sporo nauki i wiele problemów po drodze do rozwiązania. Może być Ci ciężko ogarnąć te wszystkie tematy, więc na początek proponuję napisać działającą aplikację, a dopiero później przerobienie jej w taki sposób, żeby działała na różnych bazach (jak się nie uda przerabianie, to przynajmniej będziesz miała aplikację do pokazania). Zapraszam także na grupę na FB, gdzie znajdziesz ewentualną pomoc facebook.com/groups/JavaSpringHibernate Powodzenia
@@matdabski dziękuję za podpowiedzi :) do grupy się już zapisałam. Chyba zacznę od obejrzenia całej serii i zrobię sobie ćwiczenia, a potem zdecyduję od której bazy zacznę. Profile kojarzę, bo w testach tak ustawiamy środowiska, więc może bym ogarnęła. Myślałam też o jakiejś vm-ce, która włączyłaby tryb demo. Ale w sumie profile mi to ładnie załatwią :) jeszcze raz dziękuję i pozdrawiam
@@maiky2189 tak serio, to nie chodziło tak do końca o przejście na developerke, raczej łatwiejszą zmianę pracy, co się w sumie stało :D w obecnej firmie jestem uważana za guru w sprawach javy, choć nie wiem czemu :D wśród testerów to nie takie trudne :D A co do projektu, to porzuciłam po zmianie pracy, ale pamiętam że miałam jakiś problem z wczytywaniem obrazków do db :D No i kolega mi podpowiedział, że można zapisywać stan bazy H2, więc nie kombinowałam z przepinaniem
Pisałem kiedyś o tym na blogu. Generalnie Gradle jest nowocześniejszy, dużo bardziej rozwijany, ma więcej pluginów, łatwiej napisać do niego plugina, łatwo dopisać kawałek skryptu, który zrobi coś specyficznego i to chyba mniej więcej to. A tutaj link do artykułu nullpointerexception.pl/dalczego-wole-gradle-od-mavena/
Przy próbie dodania adnotacji @RequiredArgsConstructor otrzymuję błąd "2020-10-16 10:02:40.261 ERROR 20272 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException: null at pl.mr.controller.HelloController.hello(HelloController.java:25) ~[classes/:na]" , plugin lomboka jest zainstalowany oraz annotation procesor również jest włączone, linijka 25 która wyskakuje w powyższym błędzie to wynik metody : @GetMapping("/") public String hello(){ return helloService.hello(); }
@@matdabski Tak zgadza się klasa HelloService oznaczona jest adnotacją @Service, przy ręcznym utworzeniu konstruktora, wszystko działa poprawnie. Dziękuję za szybką odpowiedź :)
@@marcinromaniak1549 Spróbuj przebudować projekt Build > Rebuild Project lub z gradla clean build (w zależności od tego jak budujesz/uruchamiasz), restart IDE też może pomóc. Zwykle z Lombokiem nie ma problemów, ale to annotation procesor w dodatku potrzebuje plugina w IDE, więc jest kilka rzeczy, które mogą się popsuć.
Jeśli podobają Ci się moje filmy, to zostaw łapkę w górę i za subskrybuj mój kanał. Zapraszam Cię także do zapoznania się z moimi kursami i warsztatami:
🟢 Kurs Hibernate i JPA - kursy.nullpointerexception.pl/hibernate/
🟠 Warsztat Architektura Heksagonalna - kursy.nullpointerexception.pl/product/warsztat-architektura-heksagonalna/
🟢 Kurs Testy Jednostkowe - kursy.nullpointerexception.pl/testy-jednostkowe/
🟠 Warsztat Architektura Warstwowa - kursy.nullpointerexception.pl/product/warsztat-architektura-warstwowa/
Mateusz potrafisz bardzo dobrze tłumaczyć i robisz świetną robotę. Pozdrawiam.
Dziękuję ;)
Super! Dzięki wielkie za tak dobrze wytłumaczenie tych zagadnień :D
Dzięki. Cieszę, że Ci się podobało.
Trafiłem na kanał dzisiaj, jest super. Moja propozycja to Reactive Spring application.
Cześć Maciej, dzięki za propozycję, na pewno rozważę taki temat ;)
Bardzo konkretnie to prowadzisz, dzieki!
Dzięki ;)
Świetny, intensywny materiał ;)
Dzięki ;)
Fajny materiał :)
Co do wstrzykiwania przez konstruktor to warto byłoby też wspomnieć w skrócie (lub też odesłać do innej lektury) czemu lepiej używać wstrzykiwania przez konstruktor niż jego alternatyw. Czekam na kolejne odcinki. Pozdrawiam :)
Cześć Szymon, dzięki za uwagi. Pozwolę sobie wkleić fragment z dokumentacji springa:
"The Spring team generally advocates constructor injection, as it lets you implement application components as immutable objects and ensures that required dependencies are not null. Furthermore, constructor-injected components are always returned to the client (calling) code in a fully initialized state. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns."
Całość można znaleźć tutaj:
docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-collaborators
Super materiał :) Moja propozycja na kolejne filmy to: Spring Security z bazą danych
Dzięki za propozycję będzie na pewno 😉
@Błażej Witczak Jasne 😉 będzie z JWT. A być może zrobię dodatkowy odcinek z OAuth2, nie wiem tylko, czy wystarczy mi na to czasu 😉
Super, tak trzymaj. Konkretnie przekazana wiedza. Zrób kiedyś SpringSecurity i zabezpieczanie wybranych endpointów apiKey.
Dzięki ;)
Super materiał!
Sugestia: Może by pociągnąć temat kontekstów i omówić warstwę persystencji w Spring Data JPA...
Dzięki za komentarz 😉 Będzie o Spring Data JPA w kolejnych częściach. Już nawet w następnej części będę o tym mówił przy okazji tworzenia rest api.
Dokładnie, chętnie się dowiem dlaczego dla repo pisze się interface i jak to łączy się z db :)
@@dawiddawidowy1093 dzięki za komentarz. Postaram się to tym opowiedzieć w czwartej części ;)
Zawsze się zastanawiałem kiedy tak faktycznie jest potrzeba używania innego scope niż singleton, jakie to ma przełożenie w realnym projekcie? Dobry materiał.
Trudno podać trafny przykład, dlatego go nie podałem ;) Generalnie można podejść do tego w taki sposób: jak chcesz przechować jakiś stan w beanie, a nie chcesz go współdzielić, to możesz użyć scope prototype. Jeśli robisz to w aplikacji webowej, to możesz skorzystać ze scope request (wtedy masz pewność, że inny użytkownik nie będzie miał dostępu do tego stanu). Ale oczywiście można to osiągnąć w dużo prostszy sposób, nie korzystając z beanów springowych. Po prostu tworzysz jakiś obiekt i zapisujesz w nim stan ;) i przekazujesz go jako parametr w metodach, w których go potrzebujesz.
To może krótki odcinek: 'tutaj mamy apke bez używania beana, a tutaj to samo już z użyciem dependency'. Tak by wykazać dokładnie jakie bonusy daje injection dependency. Po za tym świetny odcinek, powtażam się ale te podejście 'wyjaśnie wszystko co jest underneath the hood' bardzo mi pasuje.
To zamiast wstrzykiwania, używaj wszędzie np. new PostSerwis().
I np. w klasie konfiguracyjnej możesz stworzyć beana
@Bean
public PostController postController() {
return new PostController(new PostService(new PostRepository));
}
Chociaż post repository jest interfejsem, wiec tak to nie zadziała.
Ale wyglądałoby to mniej więcej tak.
Jedna uwaga. Nie jest prawdą, że trzeba zawsze ustawiać proxyMode przy wstrzykiwaniu beanów ze scopami request, session, prototype. Gdyby tak było nie byłoby to opcją. Jest to wymagane jedynie gdy wstrzykujemy beana o węższym scope do beana o szerszym scope. Przykładowo wstrzykiwanie request do session. Przy wstrzykiwaniu np. request do request lub session do request nie jest to wymagane. Samo proxyMode powoduje utworzenie klasy proxy by zapewnić istnienie zależności w momencie tworzeniu beana o szerszym scope, gdy sam bean zależności nie może zostać stworzony, bo nie istnieje wtedy sesja albo nie został wywołany request. Ten sam problem wystąpi gdy mimo użycia proxy chcemy użyć wstrzykniętej zależności gdy jej scope nie istnieje, np. zależności o scope session gdy nie ma jeszcze utworzonej sesji, wtedy spring rzuci wyjątkiem.
Dzięki za komentarz. Jest tak, jak napisałeś. Użyłem tutaj skrótu myślowego. Jeśli wstrzykniesz bean session, czy request do beana typu singleton, który jest domyślnym typem beana w springu, to będziesz musiał ustawić proxyMode (dokładnie o to mi chodziło).
To co więcej mi przyszło na myśl:
wiecej o lombooku kiedy ok kiedy nie
hascode z equals w kontekscie lombooka
controller vs rest controller
interface serwisu
rozbudowane api
własne zapytania w repo
DAO, DTO, repo kiedy co
na pewno wiecej o hibernate
Dzięki za komentarz ;) Część rzeczy będzie pojawiać się w kolejnych częściach. Co do Lomboka to może nagram osobny odcinek poświęcony tylko Lombokowi. Jeśli chodzi o Hibernate, to też będzie więcej w kolejnych częściach, ale tak naprawdę to można o nim nagrać osobny kurs ;) Nie wiem, w jakim stopniu w tym kursie będzie pokryty temat Hibernate'a
Cześć mam pytanko, bo chciałbym równocześnie rozwijać swoje restowe-api - najpierw oglądam Twój filmik -> przenoszę wiedzę do swojego projektu.
Chciałbym żeby to moje api wystawiało endpointy na zamówienia z produktami w środku, lecz mam zagwozdkę jak to zamapować, jakich encji bym potrzebował. product,order na pewno, ale czy to wystarczy? Z góry dzięki za odpowiedź.
Cześć Grzegorz. To zależy, jak dobrze chcesz to zrobić. Na początek wystarczy Product, Order, OrderItem, ProductCart, Customer, BillingAddress, ShipingAddress. Nie wiem co tam jeszcze. To chyba te podstawowe ;)
Co w przypadku gdy mamy kilka konstruktorów?
Czy w takim przypadku nie powinniśmy oznaczyć adnotacją jednego z nich?
W beanach springowych nie używa się raczej kilku konstruktorów. To framework tworzy dla ciebie obiekt (w domyślnej konfiguracji tylko jedne), więc nie potrzebujesz kilku konstruktorów. A jak z jakichś względów chcesz stworzyć sobie dodatkowy konstruktor to pewnie, któryś musisz oznaczyć adnotacją. Nie wiem jak to będzie działać, bo nigdy nie potrzebowałem takiego rozwiązania😉
Seria zapowiada się bardzo dobrze, bardzo jasno tłumaczysz :)
Jestem początkująca, trochę koduję (piszę testy automatyczne) i chciałabym stworzyć prostą apkę webową z bazą danych do zarządzania motkami nici i wzorami do haftu (relacja wiele do wielu, plus wszelkie CRUDy).
Pomyślałam, że mogłabym stworzyć sobie projekt na githubie, bo wtedy (jeżeli coś z tego wyjdzie :D ), to miałabym też co do pokazania rekruterom :D
Mam pytanie, czy jest zrabialne takie coś, żeby zrobić adapter baz danych?
Tzn. żeby rekruter mógł sobie odpalić apkę z użyciem H2 i testowymi danymi, a z kolei ja mogłabym lokalnie sobie używać MySql z realnymi danymi?
Z góry dziękuję za porady :)
Pozdrawiam
Cześć, ciekawy pomysł na aplikację ;) Co do pytania, to teoretycznie jest taka możliwość. Wystarczy, że będziesz uruchamiać projekt z różną konfiguracją, i wczytywać konfigurację w zależności od potrzeb. Można to zrobić używają profili springa:
docs.spring.io/spring-boot/docs/1.2.0.M1/reference/html/boot-features-profiles.html
i wtedy możesz mieć kilka plików konfiguracyjnych np. application-dev.properties, application-prod.properties
docs.spring.io/spring-boot/docs/1.2.0.M1/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties
Do tego musisz unikać w aplikacji używania sql, jak będziesz używała JPA to częściowo powinno załatwić sprawę. W części 9 pokazuję jak korzystać z Liquibase to narzędzie do setupowania bazy. Jak w liquibase będziesz używała xml do konfiguracji bazy to całkowicie wyeliminujesz SQL, i będziesz mogła pracować na dwóch bazach na przemiennie, zmieniając tylko aktywny profil w springu.
To sporo nauki i wiele problemów po drodze do rozwiązania. Może być Ci ciężko ogarnąć te wszystkie tematy, więc na początek proponuję napisać działającą aplikację, a dopiero później przerobienie jej w taki sposób, żeby działała na różnych bazach (jak się nie uda przerabianie, to przynajmniej będziesz miała aplikację do pokazania).
Zapraszam także na grupę na FB, gdzie znajdziesz ewentualną pomoc facebook.com/groups/JavaSpringHibernate
Powodzenia
@@matdabski dziękuję za podpowiedzi :) do grupy się już zapisałam. Chyba zacznę od obejrzenia całej serii i zrobię sobie ćwiczenia, a potem zdecyduję od której bazy zacznę. Profile kojarzę, bo w testach tak ustawiamy środowiska, więc może bym ogarnęła. Myślałam też o jakiejś vm-ce, która włączyłaby tryb demo. Ale w sumie profile mi to ładnie załatwią :) jeszcze raz dziękuję i pozdrawiam
@@terapiaMulinowa I jak kariera programisty po dwóch latach? : D
@@maiky2189 tak serio, to nie chodziło tak do końca o przejście na developerke, raczej łatwiejszą zmianę pracy, co się w sumie stało :D w obecnej firmie jestem uważana za guru w sprawach javy, choć nie wiem czemu :D wśród testerów to nie takie trudne :D A co do projektu, to porzuciłam po zmianie pracy, ale pamiętam że miałam jakiś problem z wczytywaniem obrazków do db :D No i kolega mi podpowiedział, że można zapisywać stan bazy H2, więc nie kombinowałam z przepinaniem
Mnie ciekawi dlaczego używasz gardle. To poprostu przyzwyczajenie czy uważasz, że jest lepszy od mavena?
Pisałem kiedyś o tym na blogu. Generalnie Gradle jest nowocześniejszy, dużo bardziej rozwijany, ma więcej pluginów, łatwiej napisać do niego plugina, łatwo dopisać kawałek skryptu, który zrobi coś specyficznego i to chyba mniej więcej to. A tutaj link do artykułu nullpointerexception.pl/dalczego-wole-gradle-od-mavena/
Przy próbie dodania adnotacji @RequiredArgsConstructor otrzymuję błąd "2020-10-16 10:02:40.261 ERROR 20272 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException: null
at pl.mr.controller.HelloController.hello(HelloController.java:25) ~[classes/:na]" , plugin lomboka jest zainstalowany oraz annotation procesor również jest włączone, linijka 25 która wyskakuje w powyższym błędzie to wynik metody :
@GetMapping("/")
public String hello(){
return helloService.hello();
}
Cześć, czy klasa HelloService jest oznaczona adnotacją @Service? Czy próbowałeś zrobić konstruktor ręcznie bez użycia Lomboka?
@@matdabski Tak zgadza się klasa HelloService oznaczona jest adnotacją @Service, przy ręcznym utworzeniu konstruktora, wszystko działa poprawnie. Dziękuję za szybką odpowiedź :)
@@matdabski udało się rozwiązać problem utworzone pole HelloService nie zostało u mnie oznaczone jako finalne :)
@@marcinromaniak1549 Spróbuj przebudować projekt Build > Rebuild Project lub z gradla clean build (w zależności od tego jak budujesz/uruchamiasz), restart IDE też może pomóc. Zwykle z Lombokiem nie ma problemów, ale to annotation procesor w dodatku potrzebuje plugina w IDE, więc jest kilka rzeczy, które mogą się popsuć.
ok, super ;)