我创建了这个制作人:
@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
只达到一次。有什么想法吗?
答案 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() {
...
}