没有 get 前缀的 getter 的 EL 表达式

EL expression for getter without a get prefix

我们正在使用 JAXB 生成的 类,包括一个枚举。 JAXB 为我们生成了一个如下所示的枚举。请注意,getter 而不是 在其方法名称中包含 "get"。

public enum ActionType {

    A("A"),
    B("B"),
    C("C");

    private final String value;

    ActionType(String v)
    {
        value = v;
    }

    public String value() {
        return value;
    }   

    public ActionType fromValue(String v)
    {
        for (ActionType c: ActionType.values())
        {
            if (c.value.equals("v")) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }

}

我在 JSTL 表达式中引用它时遇到问题。这不起作用:

             <c:forEach var="item" items="${action_types}">
                <form:radiobutton path="actionType" value="${item.value}"/>${item.value}
            </c:forEach>        

错误:

属性 'value' 未找到类型....ActionType

它正在寻找 getValue() 而不是我们自动生成的 value()。有什么解决方法吗?

如果您使用的是 EL 2.2+,它引入了使用括号语法调用直接方法的新功能,如 #{bean.method()},那么只需利用该功能即可。

<form:radiobutton ... value="${item.value()}" />

EL 2.2 是随 Servlet 3.0(2009 年 12 月)引入的。 Tomcat7是第一个支持的。因此,如果您使用 Tomcat 7+ 并且您的网络应用程序的 web.xml 与 Servlet 3.0+ 兼容,那么它应该可以正常工作。

如果您使用旧的 EL 版本,另一种解决方案是在与您的枚举相同的包中创建自定义 BeanInfo class(在本例中为 ActionTypeBeanInfo)将 PropertyDescriptor 更正为 value.

public class ActionTypeBeanInfo extends SimpleBeanInfo {

  public PropertyDescriptor[] getPropertyDescriptors() {
    try {
      Method readMethod = ActionType.class.getDeclaredMethod("value", new Class[0]); // not getValue
      Method writeMethod = null;     
      PropertyDescriptor value = new PropertyDescriptor("value", readMethod, writeMethod);
      return new PropertyDescriptor[] { value };
    } catch (Exception e) {
      return null;
    }
  }
}