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?
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.