1

My intention is just to invoke a conversationscoped bean by a servlet. The bean itself should increase its property ticketnumber up to 4.

This is the servlet:

@WebServlet
public class ConversationServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Inject
    private GreetingTicket ticket;


    @Override
    public void init() throws ServletException {
        System.out.println("Init");
        ticket.beginConversation();
    }

    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        System.out.println("DoGet");
        PrintWriter writer = response.getWriter();
        response.setContentType("text/html");

        ticket.addTicketNumber();

        System.out.println(ticket.getTicketNumber());

        writer.println("<h1>" + ticket.getTicketNumber() + "</h1>");

        if (ticket.getTicketNumber() == 4) {
            System.out.println("END!");
            ticket.endConversation();
        }

        writer.flush();
        writer.close();

    }
}

The class GreetingTicket is the conversationscoped CDI-Bean:

@ConversationScoped
public class GreetingTicket implements Serializable {

    @Inject
    Conversation conversation;

    private static final long serialVersionUID = 1L;
    private int ticketNumber;

    public GreetingTicket() {
        System.out.println("greeting Ticket");
    }

    public int getTicketNumber() {
        return ticketNumber;
    }

    public void setTicketNumber(int ticketNumber) {
        this.ticketNumber = ticketNumber;
    }

    public void addTicketNumber() {
        ticketNumber++;
        System.out.println("TicketNumber increased to "+ticketNumber);
    }

    public void beginConversation() {
        if (conversation.isTransient()) {
            System.out.println("Conversation Begin!");
            conversation.begin();
        }
    }

    public void endConversation() {
        if (!(conversation.isTransient())) {
            System.out.println("Conversation End!");
            conversation.end();
        }
    }
}

The result is now that the ticketnumber of GreetingTicket always only counts to 1by every request - why?

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
Hakan Kiyar
  • 1,199
  • 6
  • 16
  • 26

1 Answers1

2

@John Ament is right in his comment. You need to pass cid parameter from client to the server.

Because with following code you are always starting a new conversation:

@Override
public void init() throws ServletException {
    System.out.println("Init");
    ticket.beginConversation();
}

You need to pass request parameter named cid, something like:

@WebServlet
public class ConversationServlet extends HttpServlet {

    @Inject
    private GreetingTicket ticket;

    @Override
    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

       final String cid = request.getParameter("cid"); 
       // TODO: pass above cid to the conversation

       // ...
    }
}
halfer
  • 19,824
  • 17
  • 99
  • 186
G. Demecki
  • 10,145
  • 3
  • 58
  • 58
  • Yes, passing the CID to the servlet URL works and solves the problem. But it is not necessary to request the CID in the servlet. The conversation scoped bean is injected automatically in the correct way. – Ralph May 31 '18 at 09:30