I battled with the same issue yesterday - injection happens after the constructor has run!
On Sun, Apr 6, 2014 at 9:26 PM, John <j...@quivinco.com> wrote: > problem solved, the Logger was of course not yet injected! Duh. I wish the > IoC stack dump were more helpful. > > J > ----- Original Message ----- > From: John > To: users@tapestry.apache.org > Sent: Sunday, April 06, 2014 6:35 PM > Subject: NullPointer for service constructor > > > I'm trying to constuct a service implimentation that receives references > to a couple of other services that registers the objects into a super > class. But I get a null pointer exception. > > What am I doing wrong here? > > > public class AppModule { > > public static void bind(ServiceBinder binder) { > // bind low-level services and utilities > binder.bind(CommonsEmailNotificationSender.class); // implements > NotificationSender to send email > binder.bind(TextMarketerNotificationSender.class); // implements > NotificationSender to send sms > > ... > // bind facades > ... > binder.bind(NotificationSenderFacade.class, > DefaultNotificationSenderFacade.class); // combines the NotificationSender > instances above > > } > > > > public interface NotificationSender { > > boolean sendNotification(String toUsername, String fromUsername, > String replyto, String to, String messageText, boolean admin); > > boolean sendNotificationLater(String toUsername, String > fromUsername, String replyto, String to, String messageText, boolean admin); > > > > public interface NotificationSenderFacade { > > NotificationSender getNotificationSender(String classnme); > > boolean sendNotification(String toUsername, String fromUsername, > List<NotificationRouting>routes, String messageText, boolean admin); > > boolean sendNotificationLater(String toUsername, String > fromUsername, List<NotificationRouting>routes, String messageText, boolean > admin); > > > > public abstract class AbstractNotificationSenderFacade implements > NotificationSenderFacade { > > /** > * The log. > */ > @Inject > private Logger log; > > private Map<String, NotificationSender> notificationSenders > = new HashMap<String, NotificationSender>(); > > // put the notification senders into a map during subclass > construction > protected void registerNotificationSender(NotificationSender > notificationSender) { > String classname = notificationSender.getClass().getSimpleName(); > notificationSenders.put(classname, notificationSender); > log.info("registered " + classname); > } > > > > @EagerLoad > public class DefaultNotificationSenderFacade extends > AbstractNotificationSenderFacade { > > /** > * The log. > */ > @Inject > private Logger log; > > /** > * Create the facade for the given the notification senders. > * > * @param emailNotificationSender > * @param smsNotificationSender > */ > public > DefaultNotificationSenderFacade(CommonsEmailNotificationSender > emailNotificationSender, > TextMarketerNotificationSender smsNotificationSender) { > super(); > super.registerNotificationSender(emailNotificationSender); > super.registerNotificationSender(smsNotificationSender); > log.debug("registered notification senders"); > } > > @Override > public boolean sendNotification(String toUsername, String > fromUsername, List<NotificationRouting> routes, String messageText, boolean > admin) { > boolean success = true; > for (NotificationRouting route : routes) { > if (route.getTo().contains("@")) { > boolean done = > super.getNotificationSender("CommonsEmailNotificationSender") > .sendNotification(toUsername, fromUsername, > route.getReplyto(), route.getTo(), messageText, admin); > > > > AppModule.NotificationSenderFacade Loading class > com.quivinco.webapps.tbs.utils.DefaultNotificationSenderFacade. > AppModule.NotificationSenderFacade Marking class > com.quivinco.webapps.tbs.utils.DefaultNotificationSenderFacade to be > (re-)loaded > AppModule.NotificationSenderFacade BEGIN Analyzing > com.quivinco.webapps.tbs.utils.DefaultNotificationSenderFacade > AppModule.NotificationSenderFacade Marking class > com.quivinco.webapps.tbs.utils.AbstractNotificationSenderFacade to be > (re-)loaded > AppModule.NotificationSenderFacade BEGIN Analyzing > com.quivinco.webapps.tbs.utils.AbstractNotificationSenderFacade > AppModule.NotificationSenderFacade END Analyzing > com.quivinco.webapps.tbs.utils.AbstractNotificationSenderFacade > AppModule.NotificationSenderFacade END Analyzing > com.quivinco.webapps.tbs.utils.DefaultNotificationSenderFacade > AppModule.CommonsEmailNotificationSender Creating non-proxied instance > of service CommonsEmailNotificationSender > AppModule.CommonsEmailNotificationSender Invoking constructor > com.quivinco.webapps.tbs.utils.CommonsEmailNotificationSender() (at > CommonsEmailNotificationSender.java:23) via > com.quivinco.webapps.tbs.services.AppModule.bind(ServiceBinder) (at > AppModule.java:75) (for service 'CommonsEmailNotificationSender') > AppModule.TextMarketerNotificationSender Creating non-proxied instance > of service TextMarketerNotificationSender > AppModule.TextMarketerNotificationSender Invoking constructor > com.quivinco.webapps.tbs.utils.TextMarketerNotificationSender() (at > TextMarketerNotificationSender.java:16) via > com.quivinco.webapps.tbs.services.AppModule.bind(ServiceBinder) (at > AppModule.java:75) (for service 'TextMarketerNotificationSender') > AppModule.NotificationSenderFacade Invoking constructor public > com.quivinco.webapps.tbs.utils.DefaultNotificationSenderFacade(com.quivinco.webapps.tbs.utils.CommonsEmailNotificationSender,com.quivinco.webapps.tbs.utils.TextMarketerNotificationSender) > (for service 'NotificationSenderFacade') > ioc.Registry Error invoking constructor public > com.quivinco.webapps.tbs.utils.DefaultNotificationSenderFacade(com.quivinco.webapps.tbs.utils.CommonsEmailNotificationSender,com.quivinco.webapps.tbs.utils.TextMarketerNotificationSender): > java.lang.NullPointerException > ioc.Registry Operations trace: > ioc.Registry [ 1] Realizing service NotificationSenderFacade > ioc.Registry [ 2] Instantiating service NotificationSenderFacade > implementation via > com.quivinco.webapps.tbs.services.AppModule.bind(ServiceBinder) (at > AppModule.java:75) > ioc.Registry [ 3] Reloading class > com.quivinco.webapps.tbs.utils.DefaultNotificationSenderFacade. > ioc.Registry [ 4] Invoking constructor public > com.quivinco.webapps.tbs.utils.DefaultNotificationSenderFacade(com.quivinco.webapps.tbs.utils.CommonsEmailNotificationSender,com.quivinco.webapps.tbs.utils.TextMarketerNotificationSender) > (for service 'NotificationSenderFacade') > AppModule.NotificationSenderFacade Construction of service > NotificationSenderFacade failed: Error invoking constructor public > com.quivinco.webapps.tbs.utils.DefaultNotificationSenderFacade(com.quivinco.webapps.tbs.utils.CommonsEmailNotificationSender,com.quivinco.webapps.tbs.utils.TextMarketerNotificationSender): > java.lang.NullPointerException > > > > > --- > This email is free from viruses and malware because avast! Antivirus > protection is active. > http://www.avast.com > > > --- > This email is free from viruses and malware because avast! Antivirus > protection is active. > http://www.avast.com >