使用EL,是否可以在bean上进行字段访问,而不是getterssetters?

问题描述 投票:6回答:2

EDIT

对这一答案持怀疑态度。自从多年前我提出这个问题以来,很多事情都发生了变化。我建议现在使用龙目岛而不是我的EL解决方案。由于历史原因,留下原来的问题。


我已经严重厌倦了getterssetters堵塞我的代码,当我不需要控制对一个对象的内部状态的访问时。我不得不仍然生成getterssetters的唯一真正原因是,EL的工作原理是定位方法,而不是字段。${myBean.fieldName}. fieldName 指的是 getFieldName(). 能否扩展一个EL Resolver,除非找到一个getter,否则只返回公共字段的值?


基于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);
        }
    }
}
jsf el getter-setter field-accessors
2个回答
6
投票

你可以使用 @Getter@Setter 注释来自 龙目岛项目 如果你不想在你的Java Bean上写生成getter和setter方法。


3
投票

是的,Jsf是非常可扩展的,几乎所有的东西都可以扩展或替换。Jsf是非常可扩展的,几乎所有的东西都可以被扩展或替换。

自定义解析器的一个很好的例子是 此处

这家伙是用它来填充数据库查询的下拉列表。我确信你可以使用类似的技术来基于公共字段而不是公共getset方法进行解析。

© www.soinside.com 2019 - 2024. All rights reserved.