在Java 2.2 EL / JSF2是否有可能做实地访问,而不是getter / setter方法

2019-07-19 01:10发布

我是认真的累干将/ setter方法堵塞我的代码,当我并不需要控制访问对象的内部状态。 唯一的真正的原因,我不得不仍然产生getter / setter方法是因为JSF2.0 / EL 2.2作品定位方法,而不是字段: ${myBean.fieldName} 。 其中fieldName指功能getFieldName() 是否有可能延长的EL解析器只返回public字段值,除非一个getter被发现?

编辑:我希望这可以帮助别人。 请注意如何我明确检查,我只能用这个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);
        }
    }
}

Answer 1:

是。 JSF是非常可扩展的,几乎一切都可以扩展或替换。

自定义冲突解决的一个很好的例子是在这里

这家伙用它来填充从数据库中查询下拉列表。 我敢肯定,你可以使用类似的技术基础上的公共领域而不是公共get / set方法来解决。



Answer 2:

您可以使用@Getter / @Setter从注释项目龙目岛 ,如果你不想在你的Java Bean编写/生成getter和setter方法(S)。



文章来源: With Java EL 2.2 / JSF2 Is it possible to do field access rather than getters/setters?