jesli loguje sie jakims konkretnym username i password z bazy ktore odpowiadaja konkretnemu userowi to po zalogowaniu jak na przyklad wyluskac i wyswietlic powiedzmy e-mail tego konkretnego uzytkownika? Chodzi mi ze kazdy user po zalogowaniu ma zobaczyc na ekranie na przyklad swoj adres e-mail ktory podawal przy rejestracji. Jest on zapisany w bazie, kazdy user ma swojego maila ale jak go wyluskac zeby wyswietlic go na ekranie?
Musisz zrobic mniej wiecej tak:
- potrzebujesz ID uzytkownika albo jego hasło/username. Wedlug tego bedziesz szukał w bazie entity, ktore wyciagniesz zeby miec email.
- Robisz zapytanie do bazy i szukasz wedlug tego co masz (według ID, loginu, hasła)
- po tym zapytaniu otrzymasz entity np. User
- robisz tak jak napisała @karolinaa czyli np.
//od poczatku, powiedzmy, ze masz username uzytkownika
String username = "jakisUsername";
User user = repository.findByUsername(username); //albo z entityManagera, jakiś service, zależy jaki framework itp, ale idea taka sama - pobrac usera
String email = user.getEmail();
//robisz coś z emailem
jak coś pisz :P
Ja robiłem to w następujący sposób:
W controlerze używałem czegoś takiego:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName();
User loggedUser = userService.findByUsername(username);
String email = loggedUser.getEmail();
I później ten email dodajesz do modelu. Oczywiście id usera to był jego username.
A czy przypadkiem to Ci od razu nie zwraca usera w którego kontekście wywołana została metoda?
User loggedUser = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()
Zawsze można też stworzyć sobie ControllerAdvice, i przekazywać takiego usera od razu do ModelAttribute kontrolera.
Jezeli dobrze pamietam, to w parametrach metody konstruktora mozesz sobie od razu zazyczyc argumentu o tozsamosci.
@RequestMapping(...)
public String test(Principal principal) {
}
Można zrobić coś takiego:
@ControllerAdvice
public class UserControllerAdvice {
@ModelAttribute
public User currentUser(Authentication authentication) {
if (null != authentication){
return (User) authentication.getPrincipal();
}
return null;
}
}
Potem tylko w parametrach kontrolera dopisujesz sobie: @ModelAttribute User user i gotowe.
ok probuje robic tak jak sugerujecie ale mam problem bo w DAO robie metode:
@Override
public String getEmployeeStatus(String username) {
EmployeeEntity employee = (EmployeeEntity) sessionFactory.getCurrentSession().load(
EmployeeEntity.class, username);
return employee.getEmail();
}
i nie moge tak wywolac po usernamie, w innej metodzie wyciagam z sessionfactory po id i jest ok a jak robie tak jak powyzej to wyrzuca wyjatek:
type Exception report
message Request processing failed; nested exception is org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.student.recruitment.app.entity.EmployeeEntity. Expected: class java.lang.Integer, got class java.lang.String
description The server encountered an internal error that prevented it from fulfilling this request.
exception
Ponieważ metoda load jako drugi parametr przyjmuje integer a nie String. Musisz samemu napisać metodę z zapytaniem wyciągającą użytkownika po nazwie.
cos takiego?
sessionFactory.getCurrentSession().createQuery("from EmployeeEntity where username=username")
jak to dokladnie zrobic?
Wpisz sobie w google Spring CRUD example i tam będziesz miał przykłady.
Powinno to wyglądać mniej więcej tak jak niżej pokazałem. Nie wiem czy to dokładnie zadziała bo z głowy piszę, więc to ma raczej charakter poglądowy. Musisz to sam dopasować do swojej aplikacji.
public User findByUserName(String username) {
User user = null;
Query query = sessionFactory.getCurrentSession()
.createQuery("from EmployeeEntity where username = :username");
query.setParameter("username", username);
user = query.getSingleResult();
return user;
}
Ogólnie lepiej używać JPA zamiast tego Hibernatowego API.
@olek1, u ciebie ta klasa Query to z jakiej zaleznosci pochodzi? bo nie wiem skad zaimportowac.
ogolnie to mam teraz problem nastepujacy: mam username danego goscia i nie wiem jak za pomoca tej informacji wyciagnac co to za gosc czyli cala encje wywolac i na niej operowac np. metoda .getEmail. Przejrzalem w dokumantacji https://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Query.html dostepne metody i nie widze tam takiej ktora by mi w tym pomogla. Kolega @olek1 ma na mysli zeby korzystac przy tym z JPA ale wolalbym to zrobic metodami hibernate'a. Da sie to zrobic?
To jest z javax.persistence. Przecież moja powyższa przykładowa metoda zwraca całego usera.
@olek1, tak ale nie za bardzo moge zrobic to przy pomocy persistence bo jak importuje metode Query z pakietu javax to mam error:
Type mismatch: cannot convert from org.hibernate.Query to javax.persistence.Query
a jak importuje z org.hibernate to nie ma tego errora, jest roznica typow.
Pisz może co nie działa. Chodzi chyba o to, że ten Hibernatowy Query nie ma getSingleResult. Daj tam zamiast tego uniqueResult(). Albo zwróć listę. Tu masz przykłady używania API Hiberante: http://www.mkyong.com/hibernate/hibernate-query-examples-hql/
@olek1, uniqueResult nie moze byc bo to nie ten typ.
Type mismatch: cannot convert from Object to User
ok dziala juz wszystko, trik z lista okazal sie skuteczny, dzieki kolego @olek1 za pomoc