Для моего проекта я хочу реализовать комбинированный список с h: selectOneMenu . Я прочитал много постов о том, как правильно обрабатывать selectOneMenu и как реализовать собственный конвертер. В комбинированном ящике должен храниться идентификатор ( Long ) из другой таблицы БД (с именем fk_ID), для которой установлено ограничение. Пока что все работает, как и планировалось. Теперь к моей проблеме:
Столбец fk_ID является необязательным, поэтому первым параметром в выпадающем списке является f: selectItem без значения, помеченного как "выбирать ...". Когда я сохраняю форму и изменяю значение, все в порядке, за исключением случаев, когда я возвращаю его обратно «выбрать ...». Я получаю ошибку: нарушение целостности ограничения .
Я также обнаружил проблему: преобразователь возвращает ноль , как и предполагалось, но бин получает Long 0 .
XHTML:
<h:selectOneMenu value="#{userBean.selectedModel.fk_id}"
id="combobox">
<f:selectItem itemLabel="choose ..." />
<f:selectItems
value="#{userBean.items}"
var="item"
itemLabel="#{item.value}"
itemValue="#{item.id}"
/>
<f:converter converterId="userConverter" />
</h:selectOneMenu>
Пользовательский конвертер:
@FacesConverter(value = "userConverter")
public class UserConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
if (arg2 != null && !arg2.equals("null"))
return Long.valueOf(arg2);
return null;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
return String.valueOf(arg2);
}
}
Боб (очень короткая версия):
@Named(value = "userBean")
public class UserController implements Serializable {
@Getter
@Setter
private UserModel selectedModel;
@Getter
@Setter
private List<UserModel> items;
public void saveModel() {
selectedModel = userService.saveModel(selectedModel);
}
}
Проблема в том, что fk_id имеет значение Long 0 , но должно быть null . Я могу решить проблему, написав
if (selectedModel.getFk_id() == 0)
selectedModel.setFk_id(null);
, но это не решение, с которым мне удобно.
Мой вопрос: почему значение null , которое возвращает конвертер, Long 0 в методе saveModel () ?