Working with Sessions

A Session can be retrieved with a parameter of type Session in a controller method. For example consider the following controller:

  1. import io.micronaut.http.annotation.Controller;
  2. import io.micronaut.http.annotation.Get;
  3. import io.micronaut.http.annotation.Post;
  4. import io.micronaut.session.Session;
  5. import io.micronaut.session.annotation.SessionValue;
  6. import io.micronaut.core.annotation.Nullable;
  7. import javax.validation.constraints.NotBlank;
  8. @Controller("/shopping")
  9. public class ShoppingController {
  10. private static final String ATTR_CART = "cart"; (1)
  11. @Post("/cart/{name}")
  12. Cart addItem(Session session, @NotBlank String name) { (2)
  13. Cart cart = session.get(ATTR_CART, Cart.class).orElseGet(() -> { (3)
  14. Cart newCart = new Cart();
  15. session.put(ATTR_CART, newCart); (4)
  16. return newCart;
  17. });
  18. cart.getItems().add(name);
  19. return cart;
  20. }
  21. }
  1. import io.micronaut.http.annotation.Controller
  2. import io.micronaut.http.annotation.Get
  3. import io.micronaut.http.annotation.Post
  4. import io.micronaut.session.Session
  5. import io.micronaut.session.annotation.SessionValue
  6. import javax.annotation.Nullable
  7. import javax.validation.constraints.NotBlank
  8. @Controller("/shopping")
  9. class ShoppingController {
  10. private static final String ATTR_CART = "cart" (1)
  11. @Post("/cart/{name}")
  12. Cart addItem(Session session, @NotBlank String name) { (2)
  13. Cart cart = session.get(ATTR_CART, Cart).orElseGet({ -> (3)
  14. Cart newCart = new Cart()
  15. session.put(ATTR_CART, newCart) (4)
  16. newCart
  17. })
  18. cart.items << name
  19. cart
  20. }
  21. }
  1. import io.micronaut.http.annotation.Controller
  2. import io.micronaut.http.annotation.Get
  3. import io.micronaut.http.annotation.Post
  4. import io.micronaut.session.Session
  5. import io.micronaut.session.annotation.SessionValue
  6. @Controller("/shopping")
  7. class ShoppingController {
  8. companion object {
  9. private const val ATTR_CART = "cart" (1)
  10. }
  11. @Post("/cart/{name}")
  12. internal fun addItem(session: Session, name: String): Cart { (2)
  13. require(name.isNotBlank()) { "Name cannot be blank" }
  14. val cart = session.get(ATTR_CART, Cart::class.java).orElseGet { (3)
  15. val newCart = Cart()
  16. session.put(ATTR_CART, newCart) (4)
  17. newCart
  18. }
  19. cart.items.add(name)
  20. return cart
  21. }
  22. }
1ShoppingController declares a Session attribute named cart
2The Session is declared as a method parameter
3The cart attribute is retrieved
4Otherwise a new Cart instance is created and stored in the session

Note that because the Session is declared as a required parameter, to execute the controller action a Session will be created and saved to the SessionStore.

If you don’t want to create unnecessary sessions, declare the Session as @Nullable in which case a session will not be created and saved unnecessarily. For example:

Using @Nullable with Sessions

  1. @Post("/cart/clear")
  2. void clearCart(@Nullable Session session) {
  3. if (session != null) {
  4. session.remove(ATTR_CART);
  5. }
  6. }

Using @Nullable with Sessions

  1. @Post("/cart/clear")
  2. void clearCart(@Nullable Session session) {
  3. session?.remove(ATTR_CART)
  4. }

Using @Nullable with Sessions

  1. @Post("/cart/clear")
  2. internal fun clearCart(session: Session?) {
  3. session?.remove(ATTR_CART)
  4. }

The above method only injects a new Session if one already exists.