Sql 异步回调-gwt
我正在为我的项目使用gwt和postgres。在前端,当我单击“保存项目”按钮时,我尝试将其数据保存到后端的表中的一些小部件(这也使用创建的项目的名称) 在异步回调部分,我设置了多个表。但它没有正确地发送数据。我得到以下错误:Sql 异步回调-gwt,sql,postgresql,gwt,asynchronous,asynccallback,Sql,Postgresql,Gwt,Asynchronous,Asynccallback,我正在为我的项目使用gwt和postgres。在前端,当我单击“保存项目”按钮时,我尝试将其数据保存到后端的表中的一些小部件(这也使用创建的项目的名称) 在异步回调部分,我设置了多个表。但它没有正确地发送数据。我得到以下错误: org.postgresql.util.PSQLException: ERROR: insert or update on table "entitytype" violates foreign key constraint "entitytype_pname_fkey"
org.postgresql.util.PSQLException: ERROR: insert or update on table "entitytype" violates foreign key constraint "entitytype_pname_fkey"
Detail: Key (pname)=(Project Name) is not present in table "project".
但当我在项目表上执行select语句时,我可以看到项目名称存在
以下是回调部分的外观:
oksave.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
if(erasync == null)
erasync = GWT.create(EntityRelationService.class);
AsyncCallback<Void> callback = new AsyncCallback<Void>(){
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(Void result){ }
};
erasync.setProjects(projectname, callback);
for(int i = 0; i < boundaryPanel.getWidgetCount(); i++){
top = new Integer(boundaryPanel.getWidget(i).getAbsoluteTop()).toString();
left = new Integer(boundaryPanel.getWidget(i).getAbsoluteLeft()).toString();
if(widgetTitle.startsWith("ATTR")){
type = "regular";
erasync.setEntityAttribute(name1, name, type, top, left, projectname, callback);
} else{
erasync.setEntityType(name, top, left, projectname, callback);
}
}
}
oksave.addClickHandler(新的ClickHandler(){
@凌驾
公共作废一次点击(点击事件){
if(erasync==null)
erasync=GWT.create(EntityRelationService.class);
AsyncCallback callback=新的AsyncCallback(){
@凌驾
失败时的公共无效(可丢弃){
}
@凌驾
成功时公开作废(作废结果){}
};
setProjects(projectname,回调);
对于(int i=0;i
问题:
谢谢。有了外键约束,您必须确保erasync.setProjects(…)已完成,然后才能插入其余内容
我建议在onsuccess回调中(或从中)执行
erasync.setEntityAttribute(…)
魔术,而不是直接跳转到它。由于异步的性质,不要假设在setEntityAttribute
或setEntityType
之前将在服务器上调用setProjects(…)
方法
就我个人而言,我更喜欢一个包含所有必要信息的项目类,例如:
public class Project{
private String projectName;
private List attributes = new ArrayList();
.. other properties
// Getter & Setter methods
}
然后通过一次往返发送到服务器:
Project project = new Project();
project.setProjectName(..);
// Set other properties
erasync.saveProjects(project, callback);
您正在触发几个请求,在这些请求中(根据错误消息猜测)确实应该按顺序调用
当您调用多个rpc调用时,试着认为您应该能够以任何顺序重新排列它们(因为它们是异步的,所以这是实际发生的最重要的事情)…如果以相反的顺序运行它们没有意义,您不能按顺序启动它们
解决问题的两种方法:
嵌套:
service.callFirst(someData, new AsyncCallback<Void> callback = new AsyncCallback<Void>(){
@Override
public void onFailure(Throwable caught) {/*Handle errors*/}
@Override
public void onSuccess(Void result){
service.callSecond(someOtherData, new AsyncCallback<Void> callback = new AsyncCallback<Void>(){
/* onSuccess and onFailure for second callback here */
});
}
});
service.callFirst(someData,new AsyncCallback callback=new AsyncCallback(){
@凌驾
public void onFailure(可丢弃捕获){/*句柄错误*/}
@凌驾
成功时公开作废(作废结果){
service.callSecond(someOtherData,new AsyncCallback callback=new AsyncCallback(){
/*此处为第二次回调的onSuccess和onFailure*/
});
}
});
或者创建一个同时执行这两项操作的服务调用(推荐):
service.callFirstAndSecond(someData,someOtherData,new AsyncCallback callback=new AsyncCallback(){
@凌驾
public void onFailure(可丢弃捕获){/*句柄错误*/}
@凌驾
成功时公开作废(作废结果){
/*成功*/
}
});
第二个选项很可能不会太麻烦,因为几个嵌套的异步回调很快就会变得非常广泛和混乱,而且您只需要发出一个请求。我尝试将onsuccess部分合并,但它无法识别回调。这是否意味着我也必须在onsuccess中执行异步回调?谢谢。哦,太好了。谢谢你的成功报道!(你成功了吗?:)
service.callFirstAndSecond(someData, someOtherData, new AsyncCallback<Void> callback = new AsyncCallback<Void>(){
@Override
public void onFailure(Throwable caught) {/*Handle errors*/}
@Override
public void onSuccess(Void result){
/* Handle success */
}
});