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 > >