3

我想enum在jackrabbit 中使用一个常量作为属性值。然而,Node.setProperty()它只接受原始类型,StringValue作为属性值类型。

我查看了ValueFactory界面,但这似乎也无济于事。


换句话说,我想这样做:

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

而不是这个:

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

提前致谢。

4

1 回答 1

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从任意创建 a 的方法java.lang.Object

有三个选项:

  1. 使用 STRING 属性类型并使用 'toString()' 将您的枚举值转换为字符串;或者
  2. 使用 LONG 属性类型并使用“ ordinal() ”将枚举值转换为整数值并将其转换为 long;或者
  3. 使用 BINARY 属性类型并将您的枚举值转换为 BINARY 值

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)

于 2010-09-28T13:53:55.793 回答