Integracja Controllera i data layer

0

Witajcie,
Mam problem z integracją Controllera z warstwą dostępu do danych. Poniżej mój controller.

@Controller
@RequestMapping("/user/{username}")
public class UserController {

    private UserService userService;
    private LoginService loginService;

    @Autowired
    public UserController(UserService userService, LoginService loginService) {
        this.userService = userService;
        this.loginService = loginService;
    }

    @ModelAttribute("user")
    protected User user(@PathVariable("username") String username) {
        return this.userService.getUser(username);
    }

    @RequestMapping("/addLogin")
    public String edit(User user) {
        user.addLogin(new Login(new Date()));
        return "redirect:/added";
    }

}

Problem w tym, że w momencie wykonywania metody edit(), sesja jest już zakończona, dlatego metoda addLogin() wyrzuca wyjątek. Dlaczego tak się dzieje jest dla mnie wpełni zrozumiałe, ale zastanawiam się jak ominąć ten problem. Jak wy organizujecie controllery i warstwy serwisowe żeby nie mieć takich problemów?

Liczę na wasze wskazówki, porady :D

0

Po pierwsze jaki mandat ? po drugie jaka sesja i jaki exception ....

1

Nie bardzo rozumiem. Przecież logika nakazuje żebyś miał metody serwisu oznaczone jako @Transactional co rozwiązuje twój problem.

0

Dostaje wyjątek

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: pl.zaprogramowany.cms.entity.User.logins, could not initialize proxy - no Session

Metoda getUser() ma adnotacje @Transactional, dlatego po jej wykonaniu sesja zostaje zamknięta. W metodzie edit wykonuję metode o nazwie addLogin(), która po kolei:

@Edit
Resumując. Usera pobieram na sesji A, po czym sesja się kończy. Następnie chcę dodać Logowanie do tego Usera na sesji B.

1

To co robisz jest lekko bez sensu. Najprościej będzie jeszcze raz pobrać tego usera korzystając z ID które masz zwrócone w obiekcie User. W ogóle przesyłanie do widoku/z widoku obiektów encyjnych to proszenie się o guza. Jest to może mniej wygodne, ale zapobiega wielu błędom jeśli "przepisujesz" takie obiekty zawsze na obiekty zawierające jedynie informacje które chcesz prezentować. Gdybyś tak zrobił to w ogóle nie trafiłbyś na taki problem bo oczywiste byłoby że musisz pobrać usera z bazy na podstawie ID z obiektu który dostajesz z formularza.

0

W takim razie będę musiał zrezygnować z tej funkcjonalności w tym przypadku i zrobie jak mówisz :)

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