7

編集

この答えは鵜呑みにしないでください。何年も前にこの質問をして以来、多くのことが変わりました。EL ソリューションの代わりに Lombok を使用することをお勧めします。歴史的な理由から、元の質問を残します。


オブジェクトの内部状態へのアクセスを制御する必要がないのに、ゲッター/セッターがコードを詰まらせることに本当にうんざりしています。私がまだゲッター/セッターを生成しなければならない唯一の本当の理由は、EL がフィールドではなくメソッドを見つけることによって機能するためです${myBean.fieldName}。wherefieldNameはメソッドを指しgetFieldName()ます。ゲッターが見つからない限り、EL リゾルバーを拡張して public フィールド値を返すことは可能でしょうか?


Steve Atkinson の回答に基づく更新: これが他の人の役に立てば幸いです。ドメイン オブジェクトである Form オブジェクトまたは Lead オブジェクトでのみこの elresolver を使用することを明示的に確認する方法に注意してください。

public class PublicFieldSupportingELResolver extends ELResolver {
    @Override
    public Class<?> getCommonPropertyType(ELContext context, Object base) {
        if (base instanceof Form || base instanceof Lead) {
            try {
                context.setPropertyResolved(true);
                return base.getClass();
            } catch (Exception e) {
                context.setPropertyResolved(false);
                return null;
            }
        } else {
            context.setPropertyResolved(false);
            return null;
        }
    }

    @Override
    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) {
        return null;
    }

    @Override
    public Class<?> getType(ELContext context, Object base, Object property) {
        if (base instanceof Form || base instanceof Lead) {
            try {
                Field field = base.getClass().getField((String) property);
                context.setPropertyResolved(true);
                return field.getType();
            } catch (Exception e) {
                context.setPropertyResolved(false);
                return null;
            }
        } else {
            context.setPropertyResolved(false);
            return null;
        }
    }

    @Override
    public Object getValue(ELContext context, Object base, Object property) {
        if (base instanceof Form || base instanceof Lead) {
            try {
                Field field = base.getClass().getField((String) property);
                Object value = field.get(base);
                context.setPropertyResolved(true);
                return value;
            } catch (Exception e) {
                context.setPropertyResolved(false);
                return null;
            }
        } else {
            context.setPropertyResolved(false);
            return null;
        }
    }

    @Override
    public boolean isReadOnly(ELContext context, Object base, Object property) {
        if (base instanceof Form || base instanceof Lead) {
            try {
                base.getClass().getField((String) property);
                context.setPropertyResolved(true);
                return true;
            } catch (Exception e) {
                context.setPropertyResolved(false);
                return false;
            }
        } else {
            context.setPropertyResolved(false);
            return false;
        }
    }

    @Override
    public void setValue(ELContext context, Object base, Object property, Object value) {
        if (base instanceof Form || base instanceof Lead) {
            try {
                Field field = base.getClass().getField((String) property);
                field.set(base, value);
                context.setPropertyResolved(true);
            } catch (Exception e) {
                context.setPropertyResolved(false);
            }
        } else {
            context.setPropertyResolved(false);
        }
    }
}
4

2 に答える 2

6

Java Bean で getter および setter メソッドを作成/生成したくない場合は、 Project Lombokの@Getter/@Setter注釈を使用できます。

于 2013-01-30T17:58:31.710 に答える
3

はい。Jsf は非常に拡張性が高く、ほとんどすべてを拡張または置換できます。

カスタムリゾルバの好例はこちら

男はそれを使用して、データベースクエリからドロップダウンリストを作成していました. パブリックの get/set メソッドではなく、パブリック フィールドに基づいて解決するために、同様の手法を使用できると確信しています。

于 2013-01-30T18:00:32.273 に答える