【问题标题】:ConversationScoped bean injected in servlet behaves like a RequestScoped bean在 servlet 中注入的 ConversationScoped bean 的行为类似于 RequestScoped bean
【发布时间】:2016-04-06 23:36:50
【问题描述】:

我的意图只是通过一个 servlet 调用一个对话范围的 bean。 bean 本身应该将其属性 ticketnumber 增加到 4。

这是 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();

    }
}

GreetingTicket 类是会话范围的 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();
        }
    }
}

现在的结果是 GreetingTicketticketnumber 在每个请求中总是只计数为 1 - 为什么?

【问题讨论】:

  • 换句话说,每次开始一个新的对话。
  • 是的,我怎样才能避免这种情况?
  • 有一个 URL 查询参数 cid,需要从客户端传递到服务器。你通过了吗?
  • no ..我将如何在 servlet 中做到这一点?

标签: servlets cdi conversation-scope


【解决方案1】:

@John Ament 在他的评论中是正确的。您需要将cid 参数从客户端传递到服务器。

因为使用以下代码,您总是会开始新的对话:

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

您需要传递名为cid的请求参数,例如:

@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

       // ...
    }
}

【讨论】:

  • 是的,将 CID 传递给 servlet URL 可以工作并解决问题。但不必在 servlet 中请求 CID。会话范围的 bean 以正确的方式自动注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2017-06-21
  • 2011-06-08
  • 2016-06-08
  • 2019-08-04
  • 2015-07-14
  • 1970-01-01
相关资源
最近更新 更多