Jakarta ee CDI生产商达成了一项协议
我创建了这个制作人:Jakarta ee CDI生产商达成了一项协议,jakarta-ee,cdi,Jakarta Ee,Cdi,我创建了这个制作人: @RequestScoped public class StripeWebHookProducer { private static String HEADER_SIGNATURE = "Stripe-Signature"; @Inject @Context private HttpServletRequest request; @Produces public Event getStripeEvent() { Even
@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只访问一次。有什么想法吗?生产者可能是@requestscope,但产生的bean是@Dependent!要使其请求范围符合预期,只需注释producer方法:
生产者可能是@requestscope,但生成的bean是@Dependent!要使其请求范围符合预期,只需注释producer方法:
看起来您在类/bean和生产者方法上的注释不匹配。 问题是,生产者方法必须放在一些CDIBean中。在您的例子中,这个bean是StripeWebHookProducer,您有@RequestScope注释。这很好,但是,这似乎是偶然的,所以您可能需要重新考虑,并使用另一个,例如@ApplicationScoped或@Dependent 现在生产者方法本身。生产者的结果不受生产者所在CDIBean上的注释的影响。相反,它是由该方法上的注释定义的。下面是一些代码和解释
@ApplicationScoped
public class MyBeanWithProducer {
@Produces
@Dependent
public ProducedBean produceIt() {
}
}
上面的示例是一个具有应用范围的CDIBeanMyBeanWithProducer。它包含一个producer方法,能够创建另一个cdibean producerdbean,它将具有scope@Dependent。注意,producted 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;
}
}
看起来您在类/bean和生产者方法上的注释不匹配。 问题是,生产者方法必须放在一些CDIBean中。在您的例子中,这个bean是StripeWebHookProducer,您有@RequestScope注释。这很好,但是,这似乎是偶然的,所以您可能需要重新考虑,并使用另一个,例如@ApplicationScoped或@Dependent 现在生产者方法本身。生产者的结果不受生产者所在CDIBean上的注释的影响。相反,它是由该方法上的注释定义的。下面是一些代码和解释
@ApplicationScoped
public class MyBeanWithProducer {
@Produces
@Dependent
public ProducedBean produceIt() {
}
}
上面的示例是一个具有应用范围的CDIBeanMyBeanWithProducer。它包含一个producer方法,能够创建另一个cdibean producerdbean,它将具有scope@Dependent。注意,producted 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;
}
}
我可以从类中删除@RequestScoped吗。它的依赖性是什么意思?我可以从类中删除@RequestScoped吗。这意味着它是依赖的吗?我得到的是,事件不是一个可代理类,因为事件没有任何参数构造函数。为什么我现在会有这样的例外?可能会提出一个新的问题,从这一个,没有足够的信息告诉。但我的猜测是您键入的内容-事件没有任何参数构造函数。。你不需要参数构造函数就可以做任何事情的代理。和请求。作用域需要代理。我发现事件不是可代理类,因为事件没有任何参数构造函数。为什么我现在会有这样的例外?可能会提出一个新的问题,从这一个,没有足够的信息告诉。但我的猜测是您键入的内容-事件没有任何参数构造函数。。你不需要参数构造函数就可以做任何事情的代理。和请求。范围需要代理。