Комбобокс Javafx с пользовательским объектом отображает адрес объекта, хотя используется пользовательская фабрика ячеек

У меня есть выпадающий список, который показывает списокUser объекты. Я кодировал фабрику пользовательских ячеек для выпадающего списка:

@FXML ComboBox cmbUserIds;
cmbUserIds.setCellFactory(new Callback(){
                @Override
                public ListCell call(ListView l){
                    return new ListCell(){
                        @Override
                        protected void updateItem(Useritem, boolean empty) {
                            super.updateItem(item, empty);
                            if (item == null || empty) {
                                setGraphic(null);
                            } else {
                                setText(item.getId()+"    "+item.getName());
                            }
                        }
                    } ;
                }
            });

ListView показывает строку (id + name), но когда я выбираю элемент из списка, Combobox показывает возвращаемое значение метода toString (), то есть адрес объекта. Я могу'переопределить метод toString (), поскольку объект домена пользователя должен быть таким же, как объект на сервере. Как отобразить идентификатор в выпадающем списке? Пожалуйста, предложите

EDIT1

Я попробовал ниже код. Теперь в поле со списком отображается идентификатор, когда я выбираю значение из списка.

cmbUserIds.setConverter(new StringConverter() {
              @Override
              public String toString(User user) {
                if (user== null){
                  return null;
                } else {
                  return user.getId();
                }
              }

            @Override
            public User fromString(String id) {
                return null;
            }
        });

Выбранное значение в поле со списком очищается при потере фокуса управления. Как это исправить?

EDIT2:

@FXML AnchorPane root;
@FXML ComboBox cmbUsers;
List users;
public class GateInController implements Initializable {
@Override   
public void initialize(URL location, ResourceBundle resources) {
        users = UserService.getListOfUsers();
        cmbUsers.setItems(FXCollections.observableList(users));
        cmbUsers.getSelectionModel().selectFirst();
        // list of values showed in combo box drop down
        cmbUsers.setCellFactory(new Callback(){
            @Override
            public ListCell call(ListView l){
                return new ListCell(){
                    @Override
                    protected void updateItem(UserDTO item, boolean empty) {
                        super.updateItem(item, empty);
                        if (item == null || empty) {
                            setGraphic(null);
                        } else {
                            setText(item.getUserId()+"    "+item.getUserNm());
                        }
                    }
                } ;
            }
        });
        //selected value showed in combo box
        cmbUsers.setConverter(new StringConverter() {
              @Override
              public String toString(UserDTO user) {
                if (user == null){
                  return null;
                } else {
                  return user.getUserId();
                }
              }

            @Override
            public UserDTO fromString(String userId) {
                return null;
            }
        });
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос