依赖于String的枚举类型的JSP Bean set属性

时间:2014-07-11 08:27:56

标签: java jsp enums

我已经为我的一些枚举类型创建了bean副本,以便在JSP页面中使用。最初,当我将枚举bean设置为特定值时,我必须通过字符串比较循环遍历所有可能的枚举值,但我刚刚知道你实际上可以设置类型以匹配本机枚举类型,并且JSP处理字符串匹配本身就像下面的代码所示。

原始设置属性:

  public void setName(String name)
  {
    switch(name)
    {
      case "NONE":
        this.causeOfDisconnect = CauseOfDisconnect.NONE;
        break;
      case "EXCLUSIVE_SESSION":
        this.causeOfDisconnect = CauseOfDisconnect.EXCLUSIVE_SESSION;
        break;
      case "SESSION_TIMED_OUT":
        this.causeOfDisconnect = CauseOfDisconnect.SESSION_TIMED_OUT;
        break;
      case "INVALID_CAUSE_OF_DISCONNECT":
        this.causeOfDisconnect = CauseOfDisconnect.INVALID_CAUSE_OF_DISCONNECT;
        break;
    }
  }

新设置属性:

  public void setName(CauseOfDisconnect name)
  {
    this.causeOfDisconnect = name;
  }

枚举类型定义:

public enum CauseOfDisconnect
{
  NONE(0),
  EXCLUSIVE_SESSION(1),
  SESSION_TIMED_OUT(2),
  INVALID_CAUSE_OF_DISCONNECT(3);

  private final int code;

  private CauseOfDisconnect(int code)
  {
    this.code = code;
  }
}

在JSP中使用:

<jsp:useBean id="exclusiveSessionDisconnect" class="sessionmanager.CauseOfDisconnectBean" />
<jsp:setProperty name="exclusiveSessionDisconnect" property="name" value="EXCLUSIVE_SESSION" />

上面的代码适用于该枚举类型(具有整数内部值),但是当我将相同的“修复”应用于另一个具有String内部值的枚举类型时,服务器返回此错误:不能找到一种方法,在类型为。

的bean中写入'java.lang.String'类型的属性'name'

此类bean出错:

<jsp:useBean id="userIdCookie" class="sessionmanager.CookiesBean" />
<jsp:setProperty name="userIdCookie" property="name" value="USER_ID" />

我搜索了一个类似的问题,这个人似乎遇到了同样的问题,但我不明白他的答案。

类似问题:enums are being interpreted as Strings

关于如何使这项工作的任何想法?


更新

经过大量的代码审查后,我终于找到了导致错误的原因。在我的一些bean类中,我只定义了一个set方法。那些bean类适用于我上面做的更改(修复)。但对于其他一些人,我还定义了一个返回字符串的get方法。由于我将set方法的type参数更改为枚举类型,因此它与get方法的返回类型冲突。看来对于bean来说,你需要为get输入设置相同的类型并设置返回变量。

像这样:

public void setName(String name)

必须有相应的getter(反之亦然)

public String getName()

2 个答案:

答案 0 :(得分:1)

我不知道JSP中Enum的内部解释,但是在Enums开箱即用你有valueOf方法

   enum Test{
        AAAA
   }

   Test.valueOf("AAAA")

可以替换您的setName方法。

至于支持的值,请查看:http://www.it.cas.cz/manual/jsp/syntaxref1216.html#17460

对象目标转换为String,因此不支持此功能,您需要一个接受字符串的方法

...
Short or Short

java.lang.Short.valueOf(String)

Object

new String(string-literal)

答案 1 :(得分:0)

它正在查找带有签名setName(String)的方法,该方法已被删除。 我怀疑该解决方案是否有效,请尝试清理您的应用程序/ Web服务器的工作区并重新启动。

然后它会一直开始失败。