Second try with Gwt, Errai and CDI ...fail again...
n3k0 Nov 6, 2011 8:50 AMHi again.
In my free time, i decided to modify my example application, and give it an view like a tradicional
MVC application, i modified like this:
Config file:
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.6//EN" "http://google-web-toolkit.googlecode.com/svn/releases/1.6/distro-source/core/src/gwt-module.dtd"> <module rename-to='Login'> <inherits name="com.google.gwt.user.User"/> <inherits name="com.google.web.bindery.event.Event"/> <inherits name="com.google.gwt.user.theme.standard.Standard"/> <inherits name="org.jboss.errai.bus.ErraiBus"/> <inherits name="org.jboss.errai.ioc.Container"/> <inherits name="org.jboss.errai.enterprise.CDI"/> </module>
View (in client side):
package com.service.errai.login.client.local; import javax.annotation.PostConstruct; import javax.enterprise.inject.Typed; import javax.inject.Inject; import org.jboss.errai.bus.client.api.RemoteCallback; import org.jboss.errai.bus.client.api.base.MessageBuilder; import com.google.gwt.user.client.Window; import com.service.errai.login.client.shared.TheRemoteService; import org.jboss.errai.bus.client.framework.ClientMessageBus; import org.jboss.errai.bus.client.framework.MessageBus; import org.jboss.errai.ioc.client.api.EntryPoint; @EntryPoint public class Login { private MessageBus bus; @Inject public Login(MessageBus bus) { this.setBus(bus); } @PostConstruct public void onModuleLoad(){ ((ClientMessageBus) bus).addPostInitTask(new Runnable() { public void run() { MessageBuilder.createCall(new RemoteCallback<Boolean>() { public void callback(Boolean isHappy) { if (isHappy) Window.alert("Everyone is happy!"); } }, TheRemoteService.class).isEveryoneHappy(); } }); } public MessageBus getBus() { return bus; } public void setBus(MessageBus bus) { this.bus = bus; } }
Control (shared folder, client and server can make references in this interface):
package com.service.errai.login.client.shared; import org.jboss.errai.bus.server.annotations.Remote; @Remote public interface TheRemoteService { public boolean isEveryoneHappy(); }
Control (implementation in server side):
package com.service.errai.login.server; import javax.inject.Inject; import org.jboss.errai.bus.client.framework.MessageBus; import org.jboss.errai.bus.server.annotations.Service; import com.service.errai.login.client.shared.TheRemoteService; import com.service.errai.login.server.dao.TheDao; @Service public class TheRemoteServiceImpl implements TheRemoteService { private MessageBus bus; @Inject //THIS IS THE NEW REFERENCE private TheDao theDao; //TO A DAO @Inject public TheRemoteServiceImpl( MessageBus bus ){ this.setBus(bus); } public boolean isEveryoneHappy() { return theDao.isEveryoneHappy();//THIS IS A METHOD THAT USE THE DAO } public MessageBus getBus() { return bus; } public void setBus(MessageBus bus) { this.bus = bus; } public TheDao getTheDao() { return theDao; } public void setTheDao(TheDao theDao) { this.theDao = theDao; } }
Model (interface in server side):
package com.service.errai.login.server.dao; public interface TheDao { public boolean isEveryoneHappy(); }
Model (implementation in server side):
package com.service.errai.login.server.dao.impl; import javax.inject.Inject; import org.jboss.errai.bus.client.framework.MessageBus; import com.service.errai.login.server.dao.TheDao; public class TheDaoImpl implements TheDao { private MessageBus bus; @Inject public TheDaoImpl( MessageBus bus ){ this.setBus(bus); } @Override public boolean isEveryoneHappy() { return true; } public MessageBus getBus() { return bus; } public void setBus(MessageBus bus) { this.bus = bus; } }
I have a beans.xml in WEB-INF folder with no content.
When i deploy my application, this exception appears:
1)No implementation for com.service.errai.login.server.dao.TheDao was bound. while locating com.service.errai.login.server.dao.TheDao for field at com.service.errai.login.server.TheRemoteServiceImpl.theDao(TheRemoteServiceImpl.java:47) while locating com.service.errai.login.server.TheRemoteServiceImpl
Well, i read some articles about CDI, and (like the examples in errai) it's enough to
add an @Inject annotation in the constructor/setter/field desired to get the default implementation
of a service (it's no neccesary the @Default annotation when you just have one implementation
of a service, in this case TheDao interface)
Could someone give me some guidance to make this works?
I tested adding the annotations @Default, @Named @Typed ...a but non of these works neither.
Thanks in advance.