I have a BeanModel grid with a RowEditor. One of the columns is a CellEditor with a ComboBox. When I press revise (i.e. call startEditing of the roweditor) a ClassCastException is thrown:
Uncaught exception escaped
java.lang.ClassCastException: java.lang.String
at com.extjs.gxt.ui.client.widget.form.ComboBox.setValue(ComboBox.java:1)
at com.extjs.gxt.ui.client.widget.grid.RowEditor.startEditing(RowEditor.java:436)
at de.test.client.TestTable.reviseRow(TestTable.java:160)
...
Consequently the roweditor crashes and displays an empty line instead of editing the existing line.
error.png
Can you give me a hint about the cause of this problem? I have no idea, I'm stuck here 
Below are the most important three classes, the full code is in the attachment. Thank you in advance for any help 
GenericDropdownCombobox.java:
Code:
package de.test.client;
import java.util.List;
import com.extjs.gxt.ui.client.data.BaseListLoader;
import com.extjs.gxt.ui.client.data.ListLoadResult;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
import com.extjs.gxt.ui.client.widget.form.SimpleComboValue;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
import de.ec4u.c4.servermanager.gwt.util.DropdownDto;
public class GenericDropdownCombobox {
public static CellEditor createComboBoxEditor(String fieldLabel,
String emptyText,
RpcProxy<List<String>> rpcProxy) {
return new CellEditor(createComboBox(fieldLabel, emptyText, rpcProxy));
}
public static CellEditor createCellEditor(final SimpleComboBox<String> combo) {
return new CellEditor(combo) {
@Override
public Object preProcessValue(Object value) {
if (value == null) {
return value;
}
return combo.getStore().findModel("name", value.toString());
}
@Override
public Object postProcessValue(Object value) {
if (value == null) {
return value;
}
return ((ModelData) value).get("name");
}
};
}
public static SimpleComboBox<String> createComboBox(String fieldLabel,
String emptyText,
RpcProxy<List<String>> proxy) {
return createComboBox(fieldLabel, emptyText,
new ListStore<SimpleComboValue<String>>(
new BaseListLoader<ListLoadResult<String>>(proxy)));
}
public static SimpleComboBox<String> createComboBox(String fieldLabel,
String emptyText, ListStore<SimpleComboValue<String>> store) {
final SimpleComboBox<String> combo = new SimpleComboBox<String>();
combo.setForceSelection(true);
combo.setTriggerAction(TriggerAction.ALL);
combo.setStore(store);
return combo;
}
}
TestDto.java
Code:
package de.test.client;
import java.io.Serializable;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelTag;
public class TestDto implements BeanModelTag, Serializable {
private static final long serialVersionUID = -6372593622124984707L;
public static final String TEST_NAME = "name";
public static final String TEST_SYSTEM = "system";
private String name;
private String system;
public TestDto() {
}
public TestDto(String name, String system) {
this.name = name;
this.system = system;
}
public String getSystem() {
return system;
}
public void setSystem(String system) {
this.system = system;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static TestDto convertToTestDto(BeanModel bm) {
TestDto dto = new TestDto();
dto.setName((String) bm.get(TEST_NAME));
dto.setSystem((String) bm.get(TEST_SYSTEM));
return dto;
}
}
TestTable.java
Code:
package de.test.client;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.data.BasePagingLoader;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelReader;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.PagingLoadConfig;
import com.extjs.gxt.ui.client.data.PagingLoadResult;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.Composite;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.RowEditor;
import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar;
import com.google.gwt.user.client.rpc.AsyncCallback;
class TestTable extends Composite {
private Grid<BeanModel> gridTest;
public static int LOADROWS = 20;
private static final int COLUMN_WIDTH = 142;
private Map<String, String> columns = new HashMap<String, String>();
public List<ColumnConfig> createConfigs() {
columns.put(TestDto.TEST_NAME, "Id");
columns.put(TestDto.TEST_SYSTEM, "System");
List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
for (Map.Entry<String, String> column : columns.entrySet()) {
configs.add(new ColumnConfig(column.getKey(), column.getValue(),
COLUMN_WIDTH));
}
return configs;
}
final RowEditor<BeanModel> rowEditor = new RowEditor<BeanModel>() {
public void stopEditing(boolean saveChanges) {
super.stopEditing(saveChanges);
gridTest.enableEvents(true);
disable();
};
};
private RpcProxy<PagingLoadResult<TestDto>> proxy = new RpcProxy<PagingLoadResult<TestDto>>() {
@Override
public void load(Object loadConfig,
AsyncCallback<PagingLoadResult<TestDto>> callback) {
TestGridService.Util.getInstance().loadPage(
(PagingLoadConfig) loadConfig, callback);
}
};
private final BasePagingLoader<PagingLoadResult<ModelData>> testLoader = new BasePagingLoader<PagingLoadResult<ModelData>>(
proxy, new BeanModelReader());
public TestTable(String testImpl) {
LayoutContainer layoutContainer = new LayoutContainer();
layoutContainer.setHScrollPosition(690);
ListStore<BeanModel> testDtos = new ListStore<BeanModel>(testLoader);
final PagingToolBar pagingToolBar = new PagingToolBar(LOADROWS);
testLoader.setRemoteSort(true);
pagingToolBar.bind(testLoader);
gridTest = new Grid<BeanModel>(testDtos, new ColumnModel(
setEditor(createConfigs())));
gridTest.enable();
gridTest.setHeight(250);
gridTest.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
rowEditor.disable();
gridTest.addPlugin(rowEditor);
gridTest.addListener(Events.Attach, createGridAttachListener());
gridTest.setLoadMask(true);
gridTest.setHeight(300);
gridTest.setWidth(500);
gridTest.setBorders(true);
gridTest.setStripeRows(true);
layoutContainer.add(gridTest);
layoutContainer.add(pagingToolBar);
layoutContainer.setBorders(true);
initComponent(layoutContainer);
}
private Listener<GridEvent<BeanModel>> createGridAttachListener() {
return new Listener<GridEvent<BeanModel>>() {
public void handleEvent(GridEvent<BeanModel> bme) {
testLoader.load(0, LOADROWS);
}
};
}
private List<ColumnConfig> setEditor(List<ColumnConfig> cols) {
for (ColumnConfig config : cols) {
if (config.getId().equals(TestDto.TEST_NAME)) {
TextField<String> tf = new TextField<String>();
CellEditor ce = new CellEditor(tf);
tf.setAllowBlank(false);
ce.setEnabled(true);
ce.setVisible(true);
config.setEditor(ce);
} else if (config.getId().equals(TestDto.TEST_SYSTEM)) {
config.setEditor(createTestSystemComboBoxEditor());
}
}
return cols;
}
Grid<BeanModel> getGrid() {
return gridTest;
}
private CellEditor createTestSystemComboBoxEditor() {
return GenericDropdownCombobox.createComboBoxEditor("name",
"Select a system...", new RpcProxy<List<String>>() {
@Override
protected void load(Object loadConfig,
AsyncCallback<List<String>> callback) {
IntegrationDropdownStoreService.Util.getInstance()
.getSystemsDropdown(callback);
}
});
}
protected void reviseRow() {
BeanModel select = gridTest.getSelectionModel().getSelectedItem();
rowEditor.enable();
rowEditor.startEditing(gridTest.getStore().indexOf(select), true);
gridTest.disableEvents(true);
}
}