I'm missing the forest through the trees. Sometimes the solution is too simple.

But why do injection in component classes works? This seems to set me on the 
wrong track.

Both solutions (@InjectResource) and constructor injection works perfectly.

Many thanks
Robert


Am 28.12.2010 22:31, schrieb Igor Drobiazko:
Injection into services is not limited to constructors. It is absolutely ok
to annotate fields with @Inject. The issue here is that Logger is not a
typical service. For Logger one should use @InjectResource annotation. Same
applies for configurations.

So following should work:

public class UserServiceImpl implements UserService {

    @InjectResource
    private Logger logger;

    @Inject
    private RandomNumberGenerator randomNumber;
}

On Tue, Dec 28, 2010 at 10:19 PM, Josh Canfield<joshcanfi...@gmail.com>wrote:

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





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

Reply via email to