UiEditor / RequestFactory在ValueProxy上生成null委托

时间:2014-10-08 14:46:44

标签: gwt requestfactory

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

我希望所有工作,但是当我调用driver.edit(service)时,我得到一个null委托异常。

为什么呢?这是一个错误?

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。

1 个答案:

答案 0 :(得分:1)

如果您致电RequestFactoryEditorDriver.show,它实际上只是调用RequestFactoryEditorDriver.edit,但没有请求上下文。否则,在驾驶员需要如何接线方面应遵循相同的基本路径。

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

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);
}

你从未列出过显示编辑或显示的代码,所以我在这里猜测,但看起来你的其他代码看起来大致如下:

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位于您的堆栈跟踪中,但不在您的代码清单中,因此我无法判断在看到此情况时是否会更加明显。)