フォーミュラーとドロップダウンメニューを備えたフェイスレットページが必要です。ドロップダウン メニューを使用して、ユーザーは Lieferant タイプの POJO を選択する必要があります。
public class Lieferant extends AbstractPersistentWarenwirtschaftsObject {
private String firma;
public Lieferant(WarenwirtschaftDatabaseLayer database, String firma) {
this(database, null, firma);
}
public Lieferant(WarenwirtschaftDatabaseLayer database, Long primaryKey, String firma) {
super(database, primaryKey);
this.firma = firma;
}
public String getFirma() {
return firma;
}
@Override
public String toString() {
return getFirma();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((firma == null) ? 0 : firma.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Lieferant other = (Lieferant) obj;
if (firma == null) {
if (other.firma != null)
return false;
} else if (!firma.equals(other.firma))
return false;
return true;
}
}
私が書いたfaceletコードは次のとおりです。
<h:selectOneMenu>
鬼ごっこ。このタグは、タイプ Lieferant の POJO (Bean ではない) のリストを表示する必要があります。フェイスレットのコードは次のとおりです。
<h:selectOneMenu id="lieferant" value="#{lieferantenBestellungBackingBean.lieferant}">
<f:selectItems var="lieferant" value="#{lieferantenBackingBean.lieferanten}" itemLabel="#{lieferant.firma}" itemValue="#{lieferant.primaryKey}" />
<f:converter converterId="LieferantConverter" />
</h:selectOneMenu>
参照されたマネージド バッキング Bean は次のとおりです。
@ManagedBean
@RequestScoped
public class LieferantenBackingBean extends AbstractWarenwirtschaftsBackingBean {
private List<Lieferant> lieferanten;
public List<Lieferant> getLieferanten() {
if (lieferanten == null) {
lieferanten = getApplication().getLieferanten();
}
return lieferanten;
}
}
私の知る限り、Lieferant オブジェクトの POJO 表現と String 表現を交換するには、カスタム コンバーターが必要です。コンバーターは次のようになります。
@FacesConverter(value="LieferantConverter")
public class LieferantConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
long primaryKey = Long.parseLong(value);
WarenwirtschaftApplicationLayer application = WarenwirtschaftApplication.getInstance();
Lieferant lieferant = application.getLieferant(primaryKey);
return lieferant;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return value.toString();
}
}
ページはエラーなしで読み込まれます。Formular に入力して送信すると、ページに次のエラー メッセージが表示されます。
Bestellung:lieferantenBestellungForm:lieferant: Validierungsfehler: Wert ist keine gültige Auswahl
translated: validation error: value is not a valid selection
残念ながら、それがどの値について話しているかはわかりません。コンバーターは正常に動作しているようです。
stackoverflowと this article about selectOneMenu and convertersからこの同様の質問を見つけましたが、コードで問題を見つけることができませんでした。なぜですか
List<SelectItem>
2番目のリンクの例で使用されています。私にも同じエラーが発生します。
どんな助けでも大歓迎です。前もって感謝します。