私のプロジェクトでは、h:selectOneMenuを使用してコンボボックスを実装したいと思います。selectOneMenuを適切に処理する方法とカスタムコンバーターを実装する方法についての多くの投稿を読みました。コンボボックスは、制約が設定されている別のDBテーブル(fk_IDという名前)からのID(Long )を格納する必要があります。これまでのところ、すべてが計画どおりに機能しているようです。今私の問題に:
列fk_IDはオプションであるため、コンボボックスの最初のオプションはf:selectItemであり、「choose...」というラベルの付いた値はありません。フォームを保存して値を変更すると、「choose ...」に戻す場合を除いて、すべて問題ありません。私が得るエラーは、制約の整合性違反です。
私も問題を見つけました:コンバーターは意図したとおりにnullを返しますが、BeanはLong0を受け取ります。
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);
}
}
Bean(非常に短いバージョン):
@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がsaveModel()メソッド内のLong 0であるのはなぜですか?