Services do constructor injection, not @Inject. So create a constructor that
takes your your services as parameters and you're golden.


public class UserServiceImpl implements UserService {

   private Logger logger;

   private RandomNumberGenerator randomNumber;

   public UserServiceImpl(RandomNumberGenerator rn, Logger logger) {
      this.logger = logger;
      randomNumber = rn;
   }
}


On Tue, Dec 28, 2010 at 1:01 PM, Robert Hannebauer <rob...@hannebauer.org>wrote:

> I'm having problems with Tapestry 5.2.4 and injecting a Logger into a
> service and a component.
>
> My AppModule:
>    public static void bind(ServiceBinder binder) {
>        binder.bind(RandomNumberGenerator.class,
> SecureRandomNumberGenerator.class);
>        binder.bind(UserService.class, UserServiceImpl.class);
>    }
>
> My component class
> public class Layout
> {
>    @Inject
>    private Logger logger;
> }
>
> works as expected, but my service class throws an exception.
>
> public class UserServiceImpl implements UserService {
>
>    @Inject
>    private Logger logger;
>
>    @Inject
>    private RandomNumberGenerator randomNumber;
> }
>
> The injection of the RandomNumberGenerator also works as expected, but not
> the logger:
>
> [DEBUG] AppModule.UserService Loading class
> test.services.impl.UserServiceImpl.
> [DEBUG] AppModule.UserService Marking class
> test.services.impl.UserServiceImpl to be (re-)loaded
> [DEBUG] AppModule.UserService BEGIN Analyzing
> test.services.impl.UserServiceImpl
> [DEBUG] AppModule.UserService   END Analyzing
> test.services.impl.UserServiceImpl
> [DEBUG] AppModule.UserService Invoking constructor public
> test.services.impl.UserServiceImpl().
> [ERROR] ioc.Registry No service implements the interface org.slf4j.Logger.
> [ERROR] ioc.Registry Operations trace:
> [ERROR] ioc.Registry [ 1] Realizing service RegistryStartup
> [ERROR] ioc.Registry [ 2] Invoking
> org.apache.tapestry5.ioc.internal.services.RegistryStartup(Logger, List) (at
> RegistryStartup.java:36) via
> org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at
> TapestryIOCModule.java:55)
> [ERROR] ioc.Registry [ 3] Determining injection value for parameter #2
> (java.util.List)
> [ERROR] ioc.Registry [ 4] Collecting ordered configuration for service
> RegistryStartup
> [ERROR] ioc.Registry [ 5] Invoking method
> test.services.AppModule.initApplication(UserService, JdbcTemplate, Logger)
> (at AppModule.java:174).
> [ERROR] ioc.Registry [ 6] Reloading class
> test.services.impl.UserServiceImpl.
> [ERROR] ioc.Registry [ 7] Calculating injection value for field 'logger'
> (org.slf4j.Logger)
> [ERROR] ioc.Registry [ 8] Resolving object of type org.slf4j.Logger using
> MasterObjectProvider
>
> Caused by: org.apache.tapestry5.ioc.internal.OperationException: No service
> implements the interface org.slf4j.Logger.
>    at
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:102)
>    at
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:69)
>    at
> org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:68)
>    at
> org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1063)
>    at
> org.apache.tapestry5.ioc.internal.services.MasterObjectProviderImpl.provide(MasterObjectProviderImpl.java:41)
>    at
> $MasterObjectProvider_12d2eb17ffe.provide($MasterObjectProvider_12d2eb17ffe.java)
>    at
> org.apache.tapestry5.ioc.internal.RegistryImpl.getObject(RegistryImpl.java:811)
>    at
> org.apache.tapestry5.ioc.internal.ObjectLocatorImpl.getObject(ObjectLocatorImpl.java:50)
>    at
> org.apache.tapestry5.ioc.internal.util.InternalUtils$4.run(InternalUtils.java:368)
>    at
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:50)
>    at
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl$1.invoke(OperationTrackerImpl.java:47)
>    at
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:65)
>    at
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.run(OperationTrackerImpl.java:46)
>    at
> org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.run(PerThreadOperationTracker.java:56)
>    at
> org.apache.tapestry5.ioc.internal.RegistryImpl.run(RegistryImpl.java:1058)
>    at
> org.apache.tapestry5.ioc.internal.util.InternalUtils.injectIntoFields(InternalUtils.java:353)
>    at
> org.apache.tapestry5.ioc.internal.ConstructorServiceCreator.createObject(ConstructorServiceCreator.java:64)
>    ... 136 more
> Caused by: java.lang.RuntimeException: No service implements the interface
> org.slf4j.Logger.
>    at
> org.apache.tapestry5.ioc.internal.RegistryImpl.getService(RegistryImpl.java:670)
>    at
> org.apache.tapestry5.ioc.internal.ObjectLocatorImpl.getService(ObjectLocatorImpl.java:45)
>    at
> org.apache.tapestry5.ioc.internal.services.MasterObjectProviderImpl$1.invoke(MasterObjectProviderImpl.java:56)
>    at
> org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:65)
>    ... 151 more
>
> If i delete the injection of the logger in my UserService everything works
> fine.
>
> Is it not possible to inject a Logger into a service implementation? Why?
> It looks strange to me to mix Logger instantiation in service implementation
> (LoggerFactory.getLogger()) and component (@Inject) classes.
>
> Regards
> Robert
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>
>

Reply via email to