
google-web-toolkit - issue #5791
EditTextCell fails with a NPE when Column.getValue returns null
Found in GWT Release (e.g. 1.5.3, 1.6 RC): GWT 2.1.1
Encountered on OS / Browser (e.g. WinXP, IE6-7, FF3): Windows Vista, Chrome 8
Detailed description (please be as specific as possible): If you click on the EditTextCell cell, and if Column.getValue of the underlaying column returns null, the EditTextCell fails rendering with the following exception:
java.lang.NullPointerException: null at com.google.gwt.safehtml.shared.SafeHtmlUtils.htmlEscape(SafeHtmlUtils.java:122) at com.google.gwt.safehtml.shared.SafeHtmlUtils.fromString(SafeHtmlUtils.java:90) at com.google.gwt.text.shared.SimpleSafeHtmlRenderer.render(SimpleSafeHtmlRenderer.java:41) at com.google.gwt.text.shared.SimpleSafeHtmlRenderer.render(SimpleSafeHtmlRenderer.java:1) at com.google.gwt.cell.client.EditTextCell.render(EditTextCell.java:209) at com.google.gwt.cell.client.EditTextCell.render(EditTextCell.java:1) at com.google.gwt.cell.client.AbstractCell.setValue(AbstractCell.java:132) at com.google.gwt.cell.client.EditTextCell.edit(EditTextCell.java:240) at com.google.gwt.cell.client.EditTextCell.onBrowserEvent(EditTextCell.java:191) at com.google.gwt.cell.client.EditTextCell.onBrowserEvent(EditTextCell.java:1) at com.google.gwt.user.cellview.client.Column.onBrowserEvent(Column.java:110) at com.google.gwt.user.cellview.client.CellTable.fireEventToCell(CellTable.java:1367) at com.google.gwt.user.cellview.client.CellTable.onBrowserEvent2(CellTable.java:998) at com.google.gwt.user.cellview.client.AbstractHasData.onBrowserEvent(AbstractHasData.java:496) at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1308) at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1264) at sun.reflect.GeneratedMethodAccessor939.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157) at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:326) at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:207) at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:126) at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561) at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269) at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91) at com.google.gwt.core.client.impl.Impl.apply(Impl.java) at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:214) at sun.reflect.GeneratedMethodAccessor937.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157) at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281) at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531) at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352) at java.lang.Thread.run(Thread.java:619)
Shortest code snippet which demonstrates issue (please indicate where
actual result differs from expected result):
EditTextCell nameCell = new EditTextCell();
Column<FooDTO, String> nameColumn = new Column<FooDTO, String>(nameCell) {
@Override
public String getValue(FooDTO object) {
return object.getName();// <------------ If the value returned is null, then EditTextCell fails
}
};
Workaround if you have one:
EditTextCell nameCell = new EditTextCell();
Column<FooDTO, String> nameColumn = new Column<FooDTO, String>(nameCell) {
@Override
public String getValue(FooDTO object) {
return object.getName()==""?null:object.getName();
}
};
Links to relevant GWT Developer Forum posts:
Comment #1
Posted on Dec 22, 2010 by Grumpy RabbitSorry, workaround was supposed to be:
EditTextCell nameCell = new EditTextCell();
Column nameColumn = new Column(nameCell) {
@Override
public String getValue(FooDTO object) {
return object.getName()==null?"":object.getName();
}
};
Comment #2
Posted on Sep 13, 2011 by Massive OxThis is also a problem for the DatePickerCell, and the workaround provided here will not work with it. Doing:
return object.getDate()==null ? new Date() : object.getDate();
has the effect of setting the column value to the current date, not blank to reflect the null value.
All Cell editors should be able to handle null values.
Comment #3
Posted on Feb 14, 2012 by Grumpy KangarooHi,
I am also seeing this issue. I would like to display to a user a blank value, as i want them to enter a date if there is one not already there, instead of seeing today's date and then not realising that they need to enter a value. Is there a better workaround for this?
thanks for your time. Margaret
Comment #4
Posted on Feb 14, 2012 by Grumpy KangarooHi,
I've created a fix for myself for the moment by copying the whole of the DatePickerCell java into a new class and putting in a sanity check for date being null in the onEnterKeyDown function:
@Override protected void onEnterKeyDown(Context context, Element parent, Date value, NativeEvent event, ValueUpdater valueUpdater) { this.lastKey = context.getKey(); this.lastParent = parent; this.lastValue = value; this.lastIndex = context.getIndex(); this.lastColumn = context.getColumn(); this.valueUpdater = valueUpdater;
Date viewData = getViewData(lastKey);
Date date = (viewData == null) ? lastValue : viewData;
// it is possible for the date to be null here. ensure it has a value
if (date == null) {
date = new Date();
}
datePicker.setCurrentMonth(date);
datePicker.setValue(date);
panel.setPopupPositionAndShow(new PopupPanel.PositionCallback() {
public void setPosition(int offsetWidth, int offsetHeight) {
panel.setPopupPosition(lastParent.getAbsoluteLeft() + offsetX,
lastParent.getAbsoluteTop() + offsetY);
}
});
i hope this is helpful to anyone else with the same problem.
margaret
Comment #5
Posted on Jun 3, 2013 by Massive Cat(No comment was entered for this change.)
Status: AssumedStale