对这一答案持怀疑态度。自从多年前我提出这个问题以来,很多事情都发生了变化。我建议现在使用龙目岛而不是我的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);
}
}
}
你可以使用 @Getter
@Setter
注释来自 龙目岛项目 如果你不想在你的Java Bean上写生成getter和setter方法。
是的,Jsf是非常可扩展的,几乎所有的东西都可以扩展或替换。Jsf是非常可扩展的,几乎所有的东西都可以被扩展或替换。
自定义解析器的一个很好的例子是 此处
这家伙是用它来填充数据库查询的下拉列表。我确信你可以使用类似的技术来基于公共字段而不是公共getset方法进行解析。