Search code examples
javagwtuibinder

Error with two MultiUploader in GWT


I want to create 2 MultiUploader elements to upload jpg and pdf separately in my Composite class in GWT

public class MyClass extends Composite{
...
    @UiField(provided = true)
    MultiUploader muplDefPdf;
    @UiField(provided = true)
    MultiUploader muplDefJpg;
...
    private void setMuplDef(MultiUploader muplDef, String extention,
            IUploader.OnFinishUploaderHandler onFinishUploaderHandler,
            IUploader.OnCancelUploaderHandler onCancelUploaderHander) {
        muplDef = new MultiUploader();
        muplDef.setServletPath(muplDef.getServletPath());
        muplDef.setValidExtensions(extention);
        muplDef.setMaximumFiles(5);
        muplDef.avoidRepeatFiles(true);
        muplDef.addOnFinishUploadHandler(onFinishUploaderHandler);
        muplDef.addOnCancelUploadHandler(onCancelUploaderHander);
    }

    public MyClass() {
        setMuplDef(muplDefPdf, "pdf", onFinishUploaderHandlerPdf,
                onCancelUploaderHanderPdf);
        setMuplDef(muplDefJpg, "jpg", onFinishUploaderHandlerJpg,
                onCancelUploaderHanderJpg);
        initWidget(uiBinder.createAndBindUi(this));
    }

    private IUploader.OnFinishUploaderHandler onFinishUploaderHandlerJpg = new IUploader.OnFinishUploaderHandler() {
        @Override
        public void onFinish(IUploader uploader) {
           ...
        }
    };
    private IUploader.OnCancelUploaderHandler onCancelUploaderHanderJpg = new IUploader.OnCancelUploaderHandler() {
        @Override
        public void onCancel(IUploader uploader) {
          ...
        }
    };

    private IUploader.OnFinishUploaderHandler onFinishUploaderHandlerPdf = new IUploader.OnFinishUploaderHandler() {
        @Override
        public void onFinish(IUploader uploader) {
           ...
        }
    };
    private IUploader.OnCancelUploaderHandler onCancelUploaderHanderPdf = new IUploader.OnCancelUploaderHandler() {
        @Override
        public void onCancel(IUploader uploader) {
           ...
        }
    };
...
}

My problem is that I get an error

 Exception caught: UiField muplDefJpg with 'provided = true' was null

Why I have this error when I define muplDefJpg before initWidget. How to resolve my issue?


Solution

  • The problem you're having is not related to GWT per se, but with Java itself. When you do:

    private void setMuplDef(MultiUploader muplDef, ...) {
        muplDef = new MultiUploader();
    

    ... you must remember that in Java you always copy the reference of the parameter when you call a method (more about that in here). In that matter, you can't pass your muplDefPdf field as parameter expecting it to be instantiated inside the method.

    For your code to work properly, you need to do:

    public MyClass() {
        muplDefPdf = new MultiUploader();
        setMuplDef(muplDefPdf, "pdf", onFinishUploaderHandlerPdf,
                onCancelUploaderHanderPdf);
        muplDefJpg = new MultiUploader();
        setMuplDef(muplDefJpg, "jpg", onFinishUploaderHandlerJpg,
                onCancelUploaderHanderJpg);
        initWidget(uiBinder.createAndBindUi(this));
    }
    

    ... and remove the muplDef = new MultiUploader(); line inside the setMuplDef method.