CDI制作人达成了一次

时间:2017-07-20 13:41:48

标签: java-ee cdi

我创建了这个制作人:

@RequestScoped
public class StripeWebHookProducer {

    private static String HEADER_SIGNATURE = "Stripe-Signature";

    @Inject @Context private HttpServletRequest request;

    @Produces
    public Event getStripeEvent() {
        Event result = null;
        //...
        return result;
    }
}

正如您所看到的那样,它的范围是@RequestScoped,所以到目前为止,我已经弄清楚每次在服务器上达到请求时都应该创建它。

我将它注入我的servlet:

@WebServlet(...)
public class StripeWebhook extends HttpServlet {
    @Inject private Event paymentEvent;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            switch (this.paymentEvent.getEventType())
            {
                case customer_subscription_trialwillend:
                    break;
                case customer_subscription_updated:
                    break;
            }
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    }

尽管如此,StripeWebHookProducer.getStripeEvent只达到一次。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

似乎你在类/ bean和producer方法上的注释不匹配。 问题是,生产者方法必须放在一些CDI bean中。在你的情况下,这个bean是StripeWebHookProducer,你有@RequestScoped注释。这是完全正常的,然而,它似乎是偶然的,所以你可能想重新思考并使用另一个,如@ApplicationScoped@Dependent

现在是生产者方法本身。生产者的结果不受生产者所在的CDI bean上的注释的影响。相反,它由该方法的注释定义。这是一些解释的代码。

@ApplicationScoped
public class MyBeanWithProducer {
  @Produces
  @Dependent
  public ProducedBean produceIt() {
  }
}

以上示例是具有应用范围的CDI bean MyBeanWithProducer。它包含一个能够创建另一个CDI bean ProducedBean的生成器方法,该方法将具有范围@Dependent。请注意,生成的bean的范围与MyBeanWithProducer的范围不同。如果在producer方法上没有定义范围,则默认为@Dependent

因此,您在应用中可能需要的内容可能如下所示:

@ApplicationScoped // ensures there is only one instance of this bean in your app; assuming you have have no other request based logic here
public class StripeWebHookProducer {

    private static String HEADER_SIGNATURE = "Stripe-Signature";

    @Inject @Context private HttpServletRequest request;

    @Produces
    @RequestScoped // this will make sure this bean is created on every request anew
    public Event getStripeEvent() {
        Event result = null;
        //...
        return result;
    }
}

答案 1 :(得分:1)

生产者可能是@RequestScoped但生产的豆是@Dependent!要使其按预期作出请求,只需注释 producer方法

@Produces @RequestScoped
public Event getStripeEvent() {
    ...
}