我想在jackrabbit中使用enum
常量作为属性值。
但是,Node.setProperty()
仅接受基本类型String
和Value
作为属性值类型。
我查看了ValueFactory
界面,但这似乎也无法帮助我。
换句话说,我想这样做:
node.setProperty("name", Enum.Const);
而不是这个:
node.setProperty("name", Enum.Const.toString());
提前致谢。
答案 0 :(得分:9)
没有标准的方法可以做你想要的。 JCR API根本不允许存储任意Object值。 JCR 1.0中唯一有效的属性类型是:
STRING
BINARY
LONG
DOUBLE
DATE
BOOLEAN
NAME
PATH
REFERENCE
所有这些属性类型在JCR 2.0中都有效,但有几个新属性:
WEAKREFERENCE
URI
DECIMAL
另外,javax.jcr.ValueFactory
没有从任意Value
创建java.lang.Object
的方法。
有三种选择:
IMO,选项1最有意义。在某些情况下,选项2可能更好 - 例如,它允许在JCR-SQL和JCR-SQL2中使用属性上的比较运算符。选项3可行,但它根本不太实用。
选项1和2也可以利用节点类型约束。您可能知道,节点类型定义包括该节点类型允许的属性定义和子节点定义,并且任何属性定义都可以使用约束指定允许的值。例如,约束可以通过通配符模式或文字值(对于STRING和PATH属性),值范围(对于LONG,DOUBLE和DATE属性),长度范围(对于BINARY),节点类型要求(对于)来限制允许的属性值REFERENCE和WEAKREFERENCE属性),文字(对于NAME属性)。请注意,只要任何约束允许值,该值就被视为有效。
因此,对于选项1或2,描述枚举的属性定义可以使用约束来限制允许的值。对于选项1,枚举STRING文字值将限制在属性上设置的允许值。这是使用JCR 2.0的CND表示法的简单示例:
[ex:foo] mixin
- ex:bar(STRING)< 'VALUE1', 'VALUE2', 'VALUE3'
使用选项2,可以使用具有可接受的LONG值的范围(或范围集)。这是一个简单的例子:
[ex:foo] mixin
- ex:bar(STRING)< [0,3)