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吗。这意味着它是依赖的吗?我得到的是,事件不是一个可代理类,因为事件没有任何参数构造函数。为什么我现在会有这样的例外?可能会提出一个新的问题,从这一个,没有足够的信息告诉。但我的猜测是您键入的内容-事件没有任何参数构造函数。。你不需要参数构造函数就可以做任何事情的代理。和请求。作用域需要代理。我发现事件不是可代理类,因为事件没有任何参数构造函数。为什么我现在会有这样的例外?可能会提出一个新的问题,从这一个,没有足够的信息告诉。但我的猜测是您键入的内容-事件没有任何参数构造函数。。你不需要参数构造函数就可以做任何事情的代理。和请求。范围需要代理。