編集
この答えは鵜呑みにしないでください。何年も前にこの質問をして以来、多くのことが変わりました。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);
}
}
}