Hi,

On 10.01.2009, at 08:08, Trejkaz wrote:

Hi all.

I have a setup where a lot of concrete service classes happened to
have identical logic, so I wanted to abstract that logic to an
abstract class.  But it looks like what happens is that iPOJO won't
inject parameters unless they are on the bottom-level concrete class.

That's true



In other words, I'm trying to do this:

 public interface Service {
   void doComplicatedStuff();
 }

 @Component
 public class AbstractService implements Service {
   @Requires
   private OtherService otherService;

   @Override
   public void doComplicatedStuff() {
     // ... complicated logic using otherService ...
   }
 }

 @Component
 @Provides
 public class ConcreteService extends AbstractService {
 }

And when I get to doComplicatedStuff(), otherService is always null.

iPOJO manipulates the implementation class to support field injection. So, parent class fields are not injected. However, bind and unbind methods are supported . So, you can change your class as follow :


 @Component
 public class AbstractService implements Service {
   private OtherService otherService;

      public synchronized void bindOtherService(OtherService svc) {
                otherService = svc;
       }


      public synchronized void unbindOtherService(OtherService svc) {
                otherService = null;
       }

   @Override
   public synchronized void doComplicatedStuff() {
     // ... complicated logic using otherService ...
   }
 }


With the following metadata:
<ipojo>
    <component classname="...ConcreteService">
        <requires interfqce="...OtherService">
                <callback type="bind" method="bindOtherService"/>
                <callback type="unbind" method="unbindOtherService"/>
       </requires>
   </component>
</ipojo>



Does the iPOJO voodoo just not support this situation?  The same logic
with the same service on the concrete class works fine so I expected
it to work here too, and I didn't see any warnings at the time it
mangled the classes or at runtime, indicating any problem...

iPOJO should warn you that a field does not exist in the class, and the component type cannot be started correctly. I will check it...


Regards,


Clement





---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to