On 19 June 2010 01:54, nino martinez wael <[email protected]>wrote:

> Hi
>
> im getting a NPE in my typelistener, and are wondering why..
>

unfortunately typelisteners are not injected in time...

  http://code.google.com/p/google-guice/issues/detail?id=409

one workaround is to grab the relevant provider via the TypeEncounter
argument and cache it in a field - you can then call this provider once
injection has started (but not before, as per the encounter javadoc)

to find out when injection has started register an InjectionListener with
the same TypeEncounter (or a MembersInjector if you want to inject
members of the instance being created)

see also:

  http://code.google.com/p/google-guice/wiki/CustomInjections


http://www.sonatype.com/people/2010/01/from-plexus-to-guice-2-the-guiceplexus-bridge-and-custom-bean-injection/

HTH

Heres the module definiton:
>
> bind(SchedulerFactory.class).toProvider(getScheduleFactoryProvider())
>                 .asEagerSingleton();
>
>         ScheduledTypeListener scheduledTypeListener = new
> ScheduledTypeListener();
> requesting injection -->        requestInjection(scheduledTypeListener);
>         Matcher<TypeLiteral<?>> matcher = new
> AbstractMatcher<TypeLiteral<?>>() {
>             public boolean matches(TypeLiteral<?> type) {
>                 return
> (type.getRawType().isAnnotationPresent(Scheduled.class));
>             }
>         };
>         bindListener(matcher, scheduledTypeListener);
>
> and the code for the listener:
>
> public class ScheduledTypeListener implements TypeListener {
>
>     private SchedulerFactory schedulerFactory;
>
>     public <T> void hear(TypeLiteral<T> typeLiteral,
>             TypeEncounter<T> typeEncounter) {
>         if (typeLiteral.getRawType().isAnnotationPresent(Scheduled.class))
> {
>             startSchedule(typeLiteral.getRawType());
>         }
>     }
>
>     private void startSchedule(Class clazz) {
>
>         Scheduler sched = null;
>         try {
> NPE-->            sched = getSchedulerFactory().getScheduler();
>             sched.start();
>         } catch (SchedulerException e) {
>             // TODO Auto-generated catch block
>             e.printStackTrace();
>         }
>
>         JobDetail jobDetail = new JobDetail("myJob", // job name
>                 sched.DEFAULT_GROUP, // job group (you can also specify
> 'null'
>                 // to use the default group)
>                 clazz); // the java class to execute
>
>         CronTrigger trigger = new CronTrigger(clazz.getCanonicalName());
>
>         Scheduled scheduled = (Scheduled)
> clazz.getAnnotation(Scheduled.class);
>
>         String cronString = scheduled.cron();
>         try {
>             trigger.setCronExpression(cronString);
>             sched.scheduleJob(jobDetail, trigger);
>         } catch (Exception e) {
>             // TODO Auto-generated catch block
>             e.printStackTrace();
>         }
>
>     }
>
> Asking for injection-->    @Inject
>     public void setSchedulerFactory(SchedulerFactory schedulerFactory) {
>         this.schedulerFactory = schedulerFactory;
>     }
>
>     public SchedulerFactory getSchedulerFactory() {
>         return schedulerFactory;
>     }
>
> }
>
>
> Full source with test case here: https://slurry.googlecode.com/svn , under
> quartz4guice
>
> --
> You received this message because you are subscribed to the Google Groups
> "google-guice" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-guice%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-guice?hl=en.
>

-- 
Cheers, Stuart

-- 
You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en.

Reply via email to