【问题标题】:UiEditor/RequestFactory generate null delegate on ValueProxyUiEditor/RequestFactory 在 ValueProxy 上生成空委托
【发布时间】:2014-10-09 02:07:26
【问题描述】:

我在面向服务的体系结构中有一个 Service.class ValueProxy(我有一个像“storeService(service)”这样的服务器方法。 我会使用带有 RequestFactoryEditorDriver 的编辑器。

我希望一切正常,但是当我调用 driver.edit(service) 时,我得到一个空委托异常。

为什么?是bug?

http://crazygui.wordpress.com/tag/editor/,我找到了一个实现示例...与我的唯一区别是 SimpleBeanRequestEditorDriver.class(我有 RequestFactoryEditorDriver.class)

ServiceEditor.class

public class ServiceEditor extends Composite implements Editor<ServiceProxy>{

    private static final Logger logger = Logger.getLogger(ServiceEditor.class.getName());

    private static ServiceEditorUiBinder uiBinder = GWT
            .create(ServiceEditorUiBinder.class);

    interface ServiceEditorUiBinder extends
    UiBinder<Widget, ServiceEditor> {
    }

    //~Driver ==========================================================================================================================
    interface Driver extends RequestFactoryEditorDriver<ServiceProxy, ServiceEditor> {
    }

    Driver driver;
    //====================================================================================================================================
    @UiField
    Decorator<String> name;

    @UiField
    Decorator<String> description;

    @UiField
    Decorator<String> notes;

    @UiField
    Decorator<String> citiesString;

//  @UiField(provided=true)
//  Decorator<String> category;

//    MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();

//  @UiField(provided=true)
//  @Ignore
//    SuggestBox suggestBox = new SuggestBox(oracle);



    private BigInteger organizationId;

private EditorDelegate<ServiceProxy> delegate;

    public ServiceEditor() {
        initWidget(uiBinder.createAndBindUi(this));
        driver = GWT.create(Driver.class);
    }

    @Override
    protected void onLoad() {
        driver.initialize(ClientFactory.AppInjector.getRequestFactory(),this);
    }

    public void edit() {
        ServiceRequestContext requestContext = ClientFactory.AppInjector.getRequestFactory().getNewServiceContext();

        edit(requestContext.create(ServiceProxy.class),requestContext);
    }


    public void display(ServiceProxy p){
        driver.display(p);
    }

    public void edit(ServiceProxy p) {
        ServiceRequestContext requestContext = ClientFactory.AppInjector.getRequestFactory().getNewServiceContext();
        edit(p,requestContext);
    }   



    public void edit(ServiceProxy service,ServiceRequestContext requestContext) {
        if(service.getToken()==null) {
            requestContext.addServiceToOrganization(organizationId, service);
            //TODO: attenzione a tempistiche chiamate;
            SessionRPC.Util.getInstance().getOrganizationId(new AsyncCallback<BigInteger>() {

                @Override
                public void onSuccess(BigInteger result) {
                    organizationId = result;
                }

                @Override
                public void onFailure(Throwable caught) {

                }
            });
        }
        else 
            requestContext.updateService(service);
        driver.edit(service,requestContext);
    }   

    public RequestContext flush2(){
        return driver.flush();
    }

    public void submit(Receiver<Void> receiver){
        RequestContext context = driver.flush();
        if (driver.hasErrors()) {
            Window.alert("Driver errors!");
            return;
        }
        context.fire(receiver);
    }   

    public void notifyErrors(Set<ConstraintViolation<?>> violations) {
        driver.setConstraintViolations(violations);
        //driver.getErrors().get(0).
        logger.info("Validation Errors: /n "+driver.getErrors().toString());
    }

//  @Override
//  public void setDelegate(EditorDelegate<ServiceProxy> delegate) {
//      this.delegate = delegate;
//  }

}

ActivitySnippet...

ServiceEditor serviceEditor = GWT.create(ServiceEditor.class);
serviceEditor.display(response);

堆栈跟踪...

Caused by: com.google.gwt.core.client.JavaScriptException: (TypeError) : Cannot set property 'request' of undefined
at Unknown.$collect(JsArrayString.java:42)
at Unknown.fillInStackTrace_2(StackTraceCreator.java:180)
at Unknown.fillInStackTrace_0(StackTraceCreator.java:518)
at Unknown.fillInStackTrace(Throwable.java:115)
at Unknown.Throwable_0(Throwable.java:51)
at Unknown.Exception_0(Exception.java:25)
at Unknown.RuntimeException_0(RuntimeException.java:25)
at Unknown.JavaScriptException_1(JavaScriptException.java:117)
at Unknown.JavaScriptException_0(JavaScriptException.java:109)
at Unknown.getCachableJavaScriptException(Exceptions.java:45)
at Unknown.wrap(Exceptions.java:29)
at Unknown.$setRequestContext(RequestFactoryEditorDelegate.java:80)
at Unknown.$edit(AbstractRequestFactoryEditorDriver.java:168)
at Unknown.display_0(AbstractRequestFactoryEditorDriver.java:159)
at Unknown.$show_2(ServiceEditor.java:91)

这意味着 getDelegate() 方法(AbstractRequestFactoryEditorDriver.class 的第 168 行)返回 null。

【问题讨论】:

  • 您能否分享您的编辑器设置、您如何定义驱动程序以及带有堆栈跟踪的完整错误消息?
  • 我有更多信息的编辑帖子

标签: gwt requestfactory


【解决方案1】:

如果您调用RequestFactoryEditorDriver.show,它实际上只是调用RequestFactoryEditorDriver.edit,但没有请求上下文。否则,就驱动程序的接线方式而言,这应该遵循相同的基本路径。

在这种情况下,如果委托为空,则驱动程序尚未初始化。从您的代码:

public ServiceEditor() {
    initWidget(uiBinder.createAndBindUi(this));
    driver = GWT.create(Driver.class);
}

@Override
protected void onLoad() {
    driver.initialize(ClientFactory.AppInjector.getRequestFactory(),this);
}

public void edit() {
    ServiceRequestContext requestContext = ClientFactory.AppInjector.getRequestFactory().getNewServiceContext();

    edit(requestContext.create(ServiceProxy.class),requestContext);
}


public void display(ServiceProxy p){
    driver.display(p);
}

您从未列出在调用 edit 或 display 时显示的代码,所以我主要在这里猜测,但看起来您的其他代码大致如下:

ServiceEditor editor = new ServiceEditor();//create ui, create driver.

editor.display(data);//driver.display, which calls driver.edit

parentWidget.add(editor);// causes onLoad to be called if actually 
                         //attached to the dom, which causes driver.initialize

这是错误的。驱动程序必须在您尝试编辑或显示之前进行初始化,否则它不知道应该使用哪个编辑器对象。

相反,将 driver.initialize 移到 onLoad 之前,例如在 ServiceEditor 构造函数本身中,或者在某些允许您故意更早调用它的 init 方法中。另一种选择是在 editor.display() 之前调用 parent.add(editor),尽管这可能不起作用 - 请确保您了解导致调用 onLoad 的原因。

(请注意,ServiceEditor.show 在您的堆栈跟踪中,但不在您的代码清单中,所以我不知道看到这个机会是否会更明显。)

【讨论】:

  • 非常感谢您的回复。有用。五一开始很好:D
猜你喜欢
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2010-10-03
  • 2010-10-20
相关资源
最近更新 更多