Uploaded image for project: 'OpenWebBeans'
  1. OpenWebBeans
  2. OWB-542

Disposer is called twice on Dependent beans when injected into a managed object that is called from a JSP

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.0.0
    • 1.1.0
    • Lifecycle
    • None
    • standalone Windows environment.

    Description

      The Disposer for the "DepDate" dependent bean below will be called twice, when it should only be called once.

      Using a simple JSP with the following EL expression:

      <c:out value="${dateFromProducer.date}"/>

      where dateFromProducer.date resolves to this method in the DateFromProducer class:

      @Named
      public class DateFromProducer {
      @Inject @Named("DepDate") String currentDate;

      public String getDate()

      { return currentDate; }

      ...

      And the Dependent bean is this:

      public class TimeDependentProducer {
      @Produces @Dependent @Named("DepDate") String returnDate()

      { System.out.println("DepDate Producer called"); GregorianCalendar c = new GregorianCalendar(); return c.getTime().toString(); }

      void disposeReturnDate(@Disposes @Named("DepDate") String s)

      { System.out.println("DepDate Dipsoser called"); }

      Fix is to remove the following code from the method "inject(InjectionPoint injectionPoint)"
      in org.apache.webbeans.inject.AbstractInjectable

      // add this dependent into bean dependent list
      if (!WebBeansUtil.isStaticInjection(injectionPoint) && WebBeansUtil.isDependent(injectedBean))
      {
      if(instanceUnderInjection.get() != null)

      { ((CreationalContextImpl<?>)this.injectionOwnerCreationalContext).addDependent(instanceUnderInjection.get(),injectedBean, injected); }

      }

      that code creates a second entry in the list. The first entry is created because the code right above it:

      //Gets injectable reference for injected bean
      injected = injectionOwnerBean.getWebBeansContext().getBeanManagerImpl().getInjectableReference(injectionPoint, this.injectionOwnerCreationalContext);

      will call "addDependent(....); also.

      Attachments

        1. patchOWB542.txt
          0.9 kB
          Bill Wigger

        Activity

          People

            bergmark Joseph E Bergmark
            billwigger Bill Wigger
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - 2h
                2h
                Remaining:
                Remaining Estimate - 2h
                2h
                Logged:
                Time Spent - Not Specified
                Not Specified