我们说我有课程Project
,Employee
和ProjectAssignement
。我有一个枚举Role
,有两个值,LEADER
和FOLLOWER
。 Employee
已通过Project
对象分配到ProjectAssignment
,该对象的成员字段role
类型为Role
。
我有一个业务规则,每个项目只能有一个领导者,但可以有很多粉丝。为了实现这一点,我给Role
一个成员字段singular
,true
为LEADER
,false
为FOLLOWER
。 (我可能会在将来添加更多角色。)我的服务器端Java会检查您是否尝试将多个领导者分配给项目并且不允许您这样做。
到目前为止,我并不认为我描述了一些特别不寻常的事情。
这是一个尴尬的问题:我有一些(手写的)客户端JavaScript验证,以确保您不会将具有相同角色的多个人分配给项目。对于粉丝来说,它有一个硬编码的例外。是否有任何干净的方法可以让{1}}枚举的JavaScript代码感知,因此它可以访问Role
方法?
(显然,任何类型的东西实际上都必须在某些时候将isSingular
枚举转录为JavaScript;我想避免手动甚至半自动地执行此操作,因为这会快速变得比它更加努力&# 39;值得我在更多情况下这样做。)
我没有使用Spring或任何类似的框架,只是普通的.jsps。重写整个应用程序以使用类似的东西可能是一个好主意,但远远超出了问题的范围。
答案 0 :(得分:2)
我通常通过在页面上的一些动态生成的Javascript中添加查找表来解决此类问题。也许用户的id是关键,他们的“奇异性”就是价值。或者也许你只列出那些不太受欢迎的人(LEADER可能更少,所以只列出那些)。然后在javascript中查阅LUT。
实际上无法访问ENUM。相反,你必须自己弥补差距,即使这意味着基本上构建一个Javascript对象,它完全模拟你的服务器端对象描述,然后复制所有数据。
答案 1 :(得分:1)
我知道你正在寻找内置的东西,但毕竟我被拖入了半自动转换。
此函数会将任何Enum转换为JavaScript对象:
public static <E extends Enum<?>> String getEnumAsJavaScript(Class<E> c)
{
String name = c.getName().substring(c.getName().lastIndexOf('$')+1);
String result = "var " + name + " = {";
for (E o: c.getEnumConstants()) {
if (o.ordinal() != 0) result += ", ";
result += " " + o + ": "+ o.ordinal();
}
result += " }";
return result;
}
给出这样的枚举和发票:
public enum Role { EMPLOYEE, LEADER }
System.out.println(getEnumAsJavaScript(Role.class));
它将生成此JavaScript对象:
var Role = { EMPLOYEE: 0, LEADER: 1 }