Java 自定义JCR(Jackrabbit)节点属性类型

Java 自定义JCR(Jackrabbit)节点属性类型,java,jackrabbit,jcr,Java,Jackrabbit,Jcr,我想对jackrabbit中的属性值使用enum常量。 但是,Node.setProperty()只接受原语类型、String和Value作为属性值类型 我查看了ValueFactory界面,但这似乎也帮不了我。 换句话说,我想这样做: node.setProperty("name", Enum.Const); node.setProperty("name", Enum.Const.toString()); 而不是这个: node.setProperty("name", Enum.Cons

我想对jackrabbit中的属性值使用
enum
常量。 但是,
Node.setProperty()
只接受原语类型、
String
Value
作为属性值类型

我查看了
ValueFactory
界面,但这似乎也帮不了我。


换句话说,我想这样做:

node.setProperty("name", Enum.Const);
node.setProperty("name", Enum.Const.toString());
而不是这个:

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

提前感谢。

没有标准的方法来做你想做的事。JCR API不允许存储任意对象值。JCR 1.0中唯一有效的属性类型是:

  • STRING
  • BINARY
  • LONG
  • DOUBLE
  • 日期
  • BOOLEAN
  • NAME
  • 路径
  • 参考
所有这些属性类型在JCR 2.0中都有效,但有几个新的属性类型:

  • WEAKREFERENCE
  • URI
  • DECIMAL
另外,
javax.jcr.ValueFactory
没有从任意
java.lang.Object
创建
值的方法

有三种选择:

  • 使用字符串属性类型并使用“toString()”将枚举值转换为字符串;或
  • 使用LONG属性类型,并使用“”将枚举值转换为整数值,并将其转换为LONG;或
  • 使用二进制属性类型并将枚举值转换为二进制值
  • 在国际海事组织,选择1最有意义。在某些情况下,选项2可能更好—例如,它允许在JCR-SQL和JCR-SQL2中的属性上使用比较运算符。选项3会起作用,但一点也不实用

    选项1和2还可以利用节点类型约束。您可能知道,节点类型定义包括该节点类型允许的特性定义和子节点定义,并且任何特性定义都可以使用约束指定允许的值。例如,约束可以通过通配符模式或文字值(用于字符串和路径属性)、值范围(用于长、双精度和日期属性)、长度范围(用于二进制)、节点类型要求(用于引用和WEAKREFERENCE属性)、文字(用于名称属性)来限制允许的属性值。请注意,只要任何约束允许,as值就被视为有效

    因此,对于选项1或2,描述枚举的属性定义可以使用约束来限制允许的值。在选项1的情况下,枚举字符串文字值将限制属性上设置的允许值。下面是一个使用JCR 2.0的CND表示法的简单示例:

    [ex:foo]mixin
    -例如:条形图(字符串)<'VALUE1'、'VALUE2'、'VALUE3'

    对于选项2,具有可接受长值的范围(或范围集)将起作用。下面是一个简单的例子:

    [ex:foo]mixin
    -例如:杆(串)<[0,3]


    感谢您提供了详尽的答案。我希望避免比较字符串,因为我有一个节点类型是枚举。使用属性类型字符串将允许使用枚举中定义的值以外的值,这将是一个错误。我已经用选项1实现了它,但希望有更好的方法:)您使用的是n吗定义属性的ode类型?如果是,您可以使用约束来限制值。例如,这里有一个mixin,它定义了一个字符串类型的属性“ex:bar”,只允许3个值(很抱歉格式化):[ex:foo]mixin-ex:bar(字符串)<'VALUE1'、'VALUE2'、'VALUE3'谢谢!这太棒了:)我仍然不能在属性定义和代码之间共享常量,但它仍然比字符串好。您可以将其添加到您的答案中以提高可见性吗?
    使用长属性类型,并使用'ordinal()将枚举值转换为整数值“
    这听起来是一个非常糟糕的主意,因为它假设枚举中的值顺序不变。序数不应用于标识枚举值。使用长属性和枚举的序数肯定不理想,但如果控制枚举定义和顺序,这是可能的。同样,我尝试不这样做,但这是可能的。”乐。