通过Errai框架在GWT中发送消息 [英] Sending messages in GWT by Errai framework
问题描述
此处可以查看从客户端发送消息。
我有一个客户端 HelloServer.java ,当我点击按钮时,我想将消息发送到服务器。 b
$ b
package gwt.user.client;
import org.jboss.errai.bus.client.ErraiBus;
import org.jboss.errai.bus.client.api.base.CommandMessage;
import org.jboss.errai.bus.client.api.base.MessageBuilder;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.jboss.errai.bus.client.api.messaging.MessageBus;
import org.jboss.errai.bus.client.api.messaging.MessageCallback;
import org.jboss.errai.bus.client.api.messaging.RequestDispatcher;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
公共类HelloServer实现入口点{
私有MyTable表;
私人MessageBus巴士= ErraiBus.get();
private RequestDispatcher dispatcher = ErraiBus.getDispatcher();
UserService usrSer;
private RequestDispatcher getDispatcher(){
return this.dispatcher;
}
public void onModuleLoad(){
table = new MyTable(null);
按钮按钮=新建按钮(点击我);
//我们可以添加样式名称
button.addStyleName(pc-template-btn);
//或者我们可以在一个特定的元素上设置一个id作为样式
VerticalPanel vPanel = new VerticalPanel();
vPanel.setWidth(100%);
vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
vPanel.add(button);
vPanel.add(table);
//将表和按钮添加到RootPanel
RootPanel.get()。add(vPanel);
//创建对话框
final DialogBox dialogBox = new DialogBox();
dialogBox.setText(欢迎使用GWT服务器通讯!);
dialogBox.setAnimationEnabled(true);
Button closeButton = new Button(close);
VerticalPanel dialogVPanel = new VerticalPanel();
dialogVPanel.setWidth(100%);
dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
dialogVPanel.add(closeButton);
closeButton.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event){
dialogBox.hide();
}
});
//设置Widget的内容
dialogBox.setWidget(dialogVPanel);
button.addClickHandler(new ClickHandler(){
@Override $ b $ public void onClick(ClickEvent event){
UserServiceAsync service =(UserServiceAsync)GWT.create(UserService .class);
ServiceDefTarget serviceDef =(ServiceDefTarget)service;
serviceDef.setServiceEntryPoint(GWT.getModuleBaseURL()+userService);
UserCallback myUserCallback = new UserCallback(table);
MessageBuilder.createMessage()
.toSubject(UserServiceImpl)//(1)
.signalling()//(2)
.noErrorHandling()// (3)
.sendNowWith(getDispatcher()); //(4)
service.getUserList(myUserCallback);
}
});
$ b
UserServiceImpl.java 是我想用回调方法接收消息的服务器。
package gwt.user。服务器;
导入gwt.user.client.User;
import gwt.user.client.UserService;
import java.util.ArrayList;
import java.util.List;
导入org.jboss.errai.bus.client.api.base.CommandMessage;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.jboss.errai.bus.client.api.messaging.MessageCallback;
import org.jboss.errai.bus.server.annotations.Service;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
@Service
public class UserServiceImpl extends RemoteServiceServlet实现UserService,MessageCallback {
private static final long serialVersionUID = 1L;
私人列表<使用者> userList = new ArrayList< User>();
$ b $ public UserServiceImpl(){
User user = new User();
user.setId(1);
user.setUsername(Peter);
user.setNumberOfHits(15);
userList.add(user);
user = new User();
user.setId(2);
user.setUsername(Hanz);
user.setNumberOfHits(25);
userList.add(user); (用户对象:用户列表){
if(((User())用户getUser(String id){
}
} )object).getId()。equals(id))
return((User)object);
}
返回null;
}
公开列表< User> getUserList(){
return userList;
}
@Override
public void callback(Message message){
System.out.print(Message received);
}
public void callback(CommandMessage message){
System.out.print(Message received);
$ / code>
当我点击按钮时,错误消息:
org.jboss.errai.bus.client.api.base.NoSubscribersToDeliverTo:没有订阅者提供给主题:UserServiceImpl
org.jboss.errai.bus.client.framework.ClientMessageBusImpl.send(ClientMessageBusImpl.java:812)
org.jboss.errai.bus.client.ErraiBus $ 3.dispatch(ErraiBus.java :171)
org.jboss.errai.bus.client.api.base.CommandMessage.sendNowWith(CommandMessage.java:349)
org.jboss.errai.bus.client.api.base.DefaultMessageBuilder $ 1.sendNowWith(DefaultMessageBuilder.java:95)
gwt.user.client.HelloServer $ 2.onClick(HelloServer.java:84)
如果我用 @Service(UserServiceImpl)
注解 UserServiceImpl.java 类,它不会
当我添加
bus.subscribe(UserServiceImpl,新的UserSe rviceImpl());
之前 MessageBuilder.createMessage()
in HelloServer.java
我收到错误消息
[错误]没有源代码可用于类型gwt.user.server.UserServiceImpl;你忘了继承一个必需的模块吗?
是否有人知道如何在GWT应用程序中使用客户端和服务器之间的消息传递或向我展示一个基本示例?
答案在于螺纹。我忘了添加 ErraiApp.properties 文件。
here you can see how to send a message from client.
I have a client HelloServer.java, when i click on the button I want to send message to a server.
package gwt.user.client;
import org.jboss.errai.bus.client.ErraiBus;
import org.jboss.errai.bus.client.api.base.CommandMessage;
import org.jboss.errai.bus.client.api.base.MessageBuilder;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.jboss.errai.bus.client.api.messaging.MessageBus;
import org.jboss.errai.bus.client.api.messaging.MessageCallback;
import org.jboss.errai.bus.client.api.messaging.RequestDispatcher;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
public class HelloServer implements EntryPoint{
private MyTable table;
private MessageBus bus = ErraiBus.get();
private RequestDispatcher dispatcher = ErraiBus.getDispatcher();
UserService usrSer;
private RequestDispatcher getDispatcher(){
return this.dispatcher;
}
public void onModuleLoad() {
table = new MyTable(null);
Button button = new Button("Click me");
// We can add style names
button.addStyleName("pc-template-btn");
// or we can set an id on a specific element for styling
VerticalPanel vPanel = new VerticalPanel();
vPanel.setWidth("100%");
vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
vPanel.add(button);
vPanel.add(table);
// add table and button to the RootPanel
RootPanel.get().add(vPanel);
// create the dialog box
final DialogBox dialogBox = new DialogBox();
dialogBox.setText("Welcome to GWT Server Communication!");
dialogBox.setAnimationEnabled(true);
Button closeButton = new Button("close");
VerticalPanel dialogVPanel = new VerticalPanel();
dialogVPanel.setWidth("100%");
dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
dialogVPanel.add(closeButton);
closeButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dialogBox.hide();
}
});
// Set the contents of the Widget
dialogBox.setWidget(dialogVPanel);
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
UserServiceAsync service = (UserServiceAsync) GWT.create(UserService.class);
ServiceDefTarget serviceDef = (ServiceDefTarget) service;
serviceDef.setServiceEntryPoint(GWT.getModuleBaseURL() + "userService");
UserCallback myUserCallback = new UserCallback(table);
MessageBuilder.createMessage()
.toSubject("UserServiceImpl") // (1)
.signalling() // (2)
.noErrorHandling() // (3)
.sendNowWith(getDispatcher()); // (4)
service.getUserList(myUserCallback);
}
});
}
}
UserServiceImpl.java is the server where I want to receive the message in callback method.
package gwt.user.server;
import gwt.user.client.User;
import gwt.user.client.UserService;
import java.util.ArrayList;
import java.util.List;
import org.jboss.errai.bus.client.api.base.CommandMessage;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.jboss.errai.bus.client.api.messaging.MessageCallback;
import org.jboss.errai.bus.server.annotations.Service;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
@Service
public class UserServiceImpl extends RemoteServiceServlet implements UserService, MessageCallback {
private static final long serialVersionUID = 1L;
private List<User> userList = new ArrayList<User>();
public UserServiceImpl() {
User user = new User();
user.setId("1");
user.setUsername("Peter");
user.setNumberOfHits("15");
userList.add(user);
user = new User();
user.setId("2");
user.setUsername("Hanz");
user.setNumberOfHits("25");
userList.add(user);
}
public User getUser(String id) {
for (Object object : userList) {
if (((User) object).getId().equals(id))
return ((User) object);
}
return null;
}
public List<User> getUserList() {
return userList;
}
@Override
public void callback(Message message) {
System.out.print("Message received");
}
public void callback(CommandMessage message) {
System.out.print("Message received");
}
}
When I click the button I get no subscribers to deliver error message:
org.jboss.errai.bus.client.api.base.NoSubscribersToDeliverTo: no subscribers to deliver to for subject: UserServiceImpl
org.jboss.errai.bus.client.framework.ClientMessageBusImpl.send(ClientMessageBusImpl.java:812)
org.jboss.errai.bus.client.ErraiBus$3.dispatch(ErraiBus.java:171)
org.jboss.errai.bus.client.api.base.CommandMessage.sendNowWith(CommandMessage.java:349)
org.jboss.errai.bus.client.api.base.DefaultMessageBuilder$1.sendNowWith(DefaultMessageBuilder.java:95)
gwt.user.client.HelloServer$2.onClick(HelloServer.java:84)
If I annotate UserServiceImpl.java class with @Service("UserServiceImpl")
, it doesn't help and I get the same error.
When I add
bus.subscribe("UserServiceImpl", new UserServiceImpl());
before MessageBuilder.createMessage()
in HelloServer.java
I get error message
[ERROR] No source code is available for type gwt.user.server.UserServiceImpl; did you forget to inherit a required module?
Does anybody know how to use messaging between Client and Server in GWT applications or show me a basic example?
Answer is in this thread. I forgot to add ErraiApp.properties file.
这篇关于通过Errai框架在GWT中发送消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!