有没有标准的方式来做你想做的。 JCR API根本不允许存储任意的Object值。在JCR 1.0唯一有效的属性类型:
STRING
BINARY
LONG
DOUBLE
DATE
BOOLEAN
NAME
PATH
REFERENCE
,所有这些属性类型都在JCR 2.0有效的,但也有一些新的:
WEAKREFERENCE
URI
DECIMAL
另外,javax.jcr.ValueFactory
没有方法从任意java.lang.Object
创建Value
。
有三个选项:
- 使用String属性类型和枚举值转换为用 '的toString()' 的字符串;或
- 使用LONG属性类型并使用'ordinal()'将枚举值转换为整数值并将其转换为长整型;或
- 使用二进制属性类型和枚举值转换为二进制值
国际海事组织,选项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符号的简单示例:
[例如:FOO]混入
- 例如:巴(STRING)< 'VALUE1', 'VALUE2', 'VALUE3'
使用选项2时,具有可接受的LONG值的范围(或一组范围)将起作用。这里有一个简单的例子:
[例如:富]混入
- 例如:巴(STRING)< [0,3)
感谢详尽的答复。我想避免比较字符串,因为我有一个枚举类型的节点。使用属性类型String将允许使用enum中定义的值以外的值,这将是一个错误。我已经使用选项1实现了它,但是希望有更好的方法:) – Simeon 2010-09-28 15:12:36
您是否使用节点类型来定义属性?如果是这样,您可以使用约束来限制这些值。例如,这里有一个混合定义了一个STRING类型的属性'ex:bar',它只允许3个值(格式化抱歉): [ex:foo] mixin - ex:bar(STRING)<'VALUE1' ,'VALUE2','VALUE3' – 2010-09-28 15:43:45
谢谢!这很棒:)我仍然无法在属性定义和代码之间共享常量,但仍然比字符串更好。你可以添加到你的答案更多的知名度? – Simeon 2010-09-30 07:34:49