Re: NullPointer for service constructor

2014-04-08 Thread Lance Java
I'm sure Tapestry could do some byte code magic via plastic such that any
@Inject fields accessed in the constructor were swapped out for getters
with nice error messages. Sounds very messy / intrusive to me and I don't
think it should be implemented.
 On 7 Apr 2014 13:54, Thiago H de Paula Figueiredo thiag...@gmail.com
wrote:

 On Sun, 06 Apr 2014 16:26:47 -0300, 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.


 I'm not sure how (a better error message) that could be done. How could
 Tapestry-IoC differentiate an exception caused by field injection not done
 yet from other exceptions? Even if it's just about NPEs, I cannot see how
 that could be done.

 --
 Thiago H. de Paula Figueiredo
 Tapestry, Java and Hibernate consultant and developer
 http://machina.com.br

 -
 To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
 For additional commands, e-mail: users-h...@tapestry.apache.org




Re: NullPointer for service constructor

2014-04-08 Thread Thiago H de Paula Figueiredo
On Tue, 08 Apr 2014 05:23:13 -0300, Lance Java lance.j...@googlemail.com  
wrote:



I'm sure Tapestry could do some byte code magic via plastic such that any
@Inject fields accessed in the constructor were swapped out for getters
with nice error messages. Sounds very messy / intrusive to me and I don't
think it should be implemented.


Hi, Lance!

Hmmm, you're right, that's probably very doable (I'm not sure Plastic  
already handles throwing exceptions, and it supports just the bytecode it  
needs). You've thought in an angle I haven't though. :) Regarding being  
implemented or not, I think this kind of NPE is one that occurs in the  
exact same way with ordinary, non-Tapestry-IoC Java, so I agree that I  
shouldn't be implemented and that constructor injection is the recommended  
one.




 On 7 Apr 2014 13:54, Thiago H de Paula Figueiredo thiag...@gmail.com
wrote:


On Sun, 06 Apr 2014 16:26:47 -0300, 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.



I'm not sure how (a better error message) that could be done. How could
Tapestry-IoC differentiate an exception caused by field injection not  
done
yet from other exceptions? Even if it's just about NPEs, I cannot see  
how

that could be done.

--
Thiago H. de Paula Figueiredo
Tapestry, Java and Hibernate consultant and developer
http://machina.com.br

-
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org





--
Thiago H. de Paula Figueiredo
Tapestry, Java and Hibernate consultant and developer
http://machina.com.br

-
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org



Re: NullPointer for service constructor

2014-04-08 Thread Chris Mylonas
Hi t5 aficionados,

Am I correct in following this thread...that it is best to think of @inject
as lazy inject? (After constructor)

If so, without knowledge of tapestry internally,  sounds like a familiar
gotcha like onActivate/setupRender and instantiation/fetching-stuff

That plastic morphing sounds like a can of worms btw

Chasing-those-exceptions is never fun, although I'd prefer to do that than
compliance  documentation and openssl heartbleed shenanigans!  Cant believe
it'll be Wednesday soon!

Cheers
Chris
 On 08/04/2014 9:07 pm, Thiago H de Paula Figueiredo thiag...@gmail.com
wrote:

 On Tue, 08 Apr 2014 05:23:13 -0300, Lance Java lance.j...@googlemail.com
 wrote:

  I'm sure Tapestry could do some byte code magic via plastic such that any
 @Inject fields accessed in the constructor were swapped out for getters
 with nice error messages. Sounds very messy / intrusive to me and I don't
 think it should be implemented.


 Hi, Lance!

 Hmmm, you're right, that's probably very doable (I'm not sure Plastic
 already handles throwing exceptions, and it supports just the bytecode it
 needs). You've thought in an angle I haven't though. :) Regarding being
 implemented or not, I think this kind of NPE is one that occurs in the
 exact same way with ordinary, non-Tapestry-IoC Java, so I agree that I
 shouldn't be implemented and that constructor injection is the recommended
 one.


   On 7 Apr 2014 13:54, Thiago H de Paula Figueiredo thiag...@gmail.com
 wrote:

  On Sun, 06 Apr 2014 16:26:47 -0300, 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.


 I'm not sure how (a better error message) that could be done. How could
 Tapestry-IoC differentiate an exception caused by field injection not
 done
 yet from other exceptions? Even if it's just about NPEs, I cannot see how
 that could be done.

 --
 Thiago H. de Paula Figueiredo
 Tapestry, Java and Hibernate consultant and developer
 http://machina.com.br

 -
 To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
 For additional commands, e-mail: users-h...@tapestry.apache.org




 --
 Thiago H. de Paula Figueiredo
 Tapestry, Java and Hibernate consultant and developer
 http://machina.com.br

 -
 To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
 For additional commands, e-mail: users-h...@tapestry.apache.org




Re: NullPointer for service constructor

2014-04-08 Thread Thiago H de Paula Figueiredo
On Tue, 08 Apr 2014 10:04:20 -0300, Chris Mylonas ch...@opencsta.org  
wrote:



Hi t5 aficionados,


Hi!

Am I correct in following this thread...that it is best to think of  
@inject as lazy inject? (After constructor)


No. It's not lazy because the injection is done before the service  
instance.



If so, without knowledge of tapestry internally,  sounds like a familiar
gotcha like onActivate/setupRender and instantiation/fetching-stuff


I'm sorry, but the analogy is completely off.


That plastic morphing sounds like a can of worms btw


Actually, no, this isn't related to Plastic at all. That NPE would happen  
in the exact same way in Spring.


Again, service classes are *not* transformed by Plastic at all. Instead,  
it creates proxies that delegate method calls to the service instances.  
Just Tapestry pages, components, mixins and classes in the base package  
are transformed.


Chasing-those-exceptions is never fun, although I'd prefer to do that  
than compliance  documentation and openssl heartbleed shenanigans!  Cant  
believe it'll be Wednesday soon!


Whoosh! :D

--
Thiago H. de Paula Figueiredo
Tapestry, Java and Hibernate consultant and developer
http://machina.com.br

-
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org



Re: NullPointer for service constructor

2014-04-08 Thread Lance Java
FYI, in spring ioc you work around this issue via implementing
InitializingBean.afterPropertiesSet()

http://docs.spring.io/spring/docs/2.5.6/api/org/springframework/beans/factory/InitializingBean.html

As has been mentioned many times here, constructor injection is superior to
field injection for many reasons


Re: NullPointer for service constructor

2014-04-08 Thread Chris Poulsen
It seems like tapestry ioc has @PostInjection (
https://tapestry.apache.org/injection-in-detail.html#InjectioninDetail-Post-InjectionMethods)
to receive a callback after the instance is configured.Somewhat
similar to the afterPropertiesSet().


On Tue, Apr 8, 2014 at 3:55 PM, Lance Java lance.j...@googlemail.comwrote:

 FYI, in spring ioc you work around this issue via implementing
 InitializingBean.afterPropertiesSet()


 http://docs.spring.io/spring/docs/2.5.6/api/org/springframework/beans/factory/InitializingBean.html

 As has been mentioned many times here, constructor injection is superior to
 field injection for many reasons



Re: NullPointer for service constructor

2014-04-07 Thread Thiago H de Paula Figueiredo

On Sun, 06 Apr 2014 16:26:47 -0300, 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.


I'm not sure how (a better error message) that could be done. How could  
Tapestry-IoC differentiate an exception caused by field injection not done  
yet from other exceptions? Even if it's just about NPEs, I cannot see how  
that could be done.


--
Thiago H. de Paula Figueiredo
Tapestry, Java and Hibernate consultant and developer
http://machina.com.br

-
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org



Re: NullPointer for service constructor

2014-04-06 Thread John
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, 
ListNotificationRoutingroutes, String messageText, boolean admin);

  boolean sendNotificationLater(String toUsername, String fromUsername, 
ListNotificationRoutingroutes, String messageText, boolean admin);



  public abstract class AbstractNotificationSenderFacade implements 
NotificationSenderFacade {

  /**
   * The log.
   */
  @Inject
  private Logger log;

  private MapString, NotificationSender notificationSenders
  = new HashMapString, 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, 
ListNotificationRouting 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')
  

Re: NullPointer for service constructor

2014-04-06 Thread Sanket Sharma
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,
 ListNotificationRoutingroutes, String messageText, boolean admin);

   boolean sendNotificationLater(String toUsername, String
 fromUsername, ListNotificationRoutingroutes, String messageText, boolean
 admin);



   public abstract class AbstractNotificationSenderFacade implements
 NotificationSenderFacade {

   /**
* The log.
*/
   @Inject
   private Logger log;

   private MapString, NotificationSender notificationSenders
   = new HashMapString, 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, ListNotificationRouting 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
 

Re: NullPointer for service constructor

2014-04-06 Thread Kalle Korhonen
Constructor injection has these three distinct advantages over field/setter
injection:
- always thread safe
- fields can be marked final
- you don't have to keep references to objects you need during construction

Kalle


On Sun, Apr 6, 2014 at 1:08 PM, Sanket Sharma sanketsha...@gmail.comwrote:

 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,
  ListNotificationRoutingroutes, String messageText, boolean admin);
 
boolean sendNotificationLater(String toUsername, String
  fromUsername, ListNotificationRoutingroutes, String messageText,
 boolean
  admin);
 
 
 
public abstract class AbstractNotificationSenderFacade implements
  NotificationSenderFacade {
 
/**
 * The log.
 */
@Inject
private Logger log;
 
private MapString, NotificationSender notificationSenders
= new HashMapString, 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, ListNotificationRouting 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