カスタムUISelectOneコンポーネントに問題があります。私の目的は、独自のデータを含む新しいカスタムコンポーネントを作成することです。だから私は、以下のように、コンポーネントのcostactorメソッドでデータアクセスを作成しました。私はコントロールをXHTMLファイルに配置すると、ページの最初の読み込みで正しく機能しますが、HTMLページのボタンをサブビューするときにクリックするとエラーが発生し、警告が表示されます。エラーメッセージと警告メッセージは以下のようになります。JSFカスタムUISelectOne POSTbackエラー。検証エラー:値が無効です
ところで私はいくつかの類似した問題を見てきました。しかし、それらのどれもカスタムコントロールに関するものではなく、私は自分の問題を解決できませんでした。私が言ったように、私はコンポーネントの請負業者にデータをロードしたい。だから私の状況は違うと思う。
) WARNING: FacesMessage(s) have been enqueued, but may not have been displayed. sourceId=j_idt6:j_idt7[severity=(ERROR 2), summary=(j_idt6:j_idt7: Validation Error: Value is not valid), detail=(j_idt6:j_idt7: Validation Error: Value is not valid)]
ので、私のコントロールとフォーマッタコード:
@Named("ABankAccountList")
@RequestScoped
@FacesComponent(createTag = true, namespace = "http://abank.com.tr/example", tagName = "ABankAccountList", value = "com.abank.customcontrols.ABankAccountList")
public class ABankAccountList extends UISelectOne {
private List<Account> accounts;
public ABankAccountList() {
this.setConverter(new AccountConverter());
accounts=new ArrayList<Account>();
Account tempAcc = null;
for (int i = 5; i < 8; i++) {
tempAcc = new Account();
tempAcc.setAccountId(i);
tempAcc.setAccountNumber(i + "0456-789");
tempAcc.setCurrencyCode("TRY");
tempAcc.setIbanNumber("TR-" + i + "-98583213213223");
accounts.add(tempAcc);
}
}
public List<Account> getAccounts() {
return accounts;
}
public void setAccounts(List<Account> accounts) {
this.accounts = accounts;
}
// After POST Back
@Override
public void decode(FacesContext context) {
super.decode(context);
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
if (context.isPostback())
{
return ;
}
UISelectItems selectItems = new UISelectItems();
List<SelectItem> result = new ArrayList<SelectItem>();
try {
for (Account account : accounts) {
SelectItem item = new SelectItem(account, account.getAccountNumber());
result.add(item);
}
} catch (Exception e) {
// log.error("Failed to create enum list", e);
}
getChildren().clear();
selectItems.setValue(result);
getChildren().add(selectItems);
}
// Render HTML
@Override
public void encodeEnd(FacesContext context) throws IOException {
super.encodeEnd(context);
}
}
また、私は以下のようにConvertetクラスを持っています。 そして、コードをデバッグすると、ポストバックの後にgetAsObjectメソッドが2回発生することがわかりました。私はそれが正常かどうか分からないのですか?
@FacesConverter(value = "AccountConverter")
public class AccountConverter implements Converter
{
@Override
public Object getAsObject(FacesContext context, UIComponent uiComponent, String arg2)
{
ValueExpression vex = context.getApplication().getExpressionFactory() .createValueExpression(context.getELContext(),
"#{ABankAccountList}", ABankAccountList.class);
ABankAccountList contoller = (ABankAccountList)vex.getValue(context.getELContext());
Account rAccount=null;
for (Account acc : contoller.getAccounts()) {
if (arg2.toString().equals(acc.getAccountId().toString())) {
rAccount = acc;
}
}
return rAccount;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object account) {
Account accctemp=((Account)account);
Integer accid=accctemp.getAccountId();
return accid.toString();
}
}
は、実際に私は、私は、データをロードする必要があるとwhreerはConverterクラスを設定しなければならない場所について確認していません。私が理解しているのは、問題は、ポストバックの前後でデータが一致しているためです。しかし、私は何をすべきか分かりません。
よろしくお願いいたします。