2010-09-28 68 views
3

我想使用一个enum常量来表示特拉比特中的属性值。 但Node.setProperty()只接受原始类型StringValue作为属性值类型。自定义JCR(Jackrabbit)节点属性类型

我看了一下ValueFactory接口,但是看起来好像也无法帮到我。


换句话说,我想这样做:

node.setProperty("name", Enum.Const); 

,而不是这样的:

node.setProperty("name", Enum.Const.toString()); 

在此先感谢。

回答

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没有方法从任意java.lang.Object创建Value

有三个选项:

  1. 使用String属性类型和枚举值转换为用 '的toString()' 的字符串;或
  2. 使用LONG属性类型并使用'ordinal()'将枚举值转换为整数值并将其转换为长整型;或
  3. 使用二进制属性类型和枚举值转换为二进制值

国际海事组织,选项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)

+0

感谢详尽的答复。我想避免比较字符串,因为我有一个枚举类型的节点。使用属性类型String将允许使用enum中定义的值以外的值,这将是一个错误。我已经使用选项1实现了它,但是希望有更好的方法:) – Simeon 2010-09-28 15:12:36

+1

您是否使用节点类型来定义属性?如果是这样,您可以使用约束来限制这些值。例如,这里有一个混合定义了一个STRING类型的属性'ex:bar',它只允许3个值(格式化抱歉): [ex:foo] mixin - ex:bar(STRING)<'VALUE1' ,'VALUE2','VALUE3' – 2010-09-28 15:43:45

+0

谢谢!这很棒:)我仍然无法在属性定义和代码之间共享常量,但仍然比字符串更好。你可以添加到你的答案更多的知名度? – Simeon 2010-09-30 07:34:49