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

标签 java jackrabbit jcr

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

我查看了 ValueFactory 接口(interface),但这似乎也帮不了我。


换句话说,我想这样做:

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

而不是这个:

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

提前致谢。

最佳答案

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

  • STRING
  • 二进制
  • 日期
  • boolean 值
  • 姓名
  • 路径
  • 引用

所有这些属性类型在 JCR 2.0 中都是有效的,但有几个新的:

  • 弱引用
  • URI
  • 十进制

此外,javax.jcr.ValueFactory 没有从任意 java.lang.Object 创建 Value 的方法。

共有三个选项:

  1. 使用 STRING 属性类型并使用“toString()”将您的枚举值转换为字符串;或
  2. 使用 LONG 属性类型并使用“ordinal()”将您的枚举值转换为整数值' 并长期转换;或
  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)

关于java - 自定义 JCR (Jackrabbit) 节点属性类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3812884/

相关文章:

versioning - 如何在 jackrabbit/JCR 中标记特定版本?

java - CPU 负载问题 (Magnolia-5.3.3 Jackrabbit-2.8.0)

image - 存储图像以在 SOLR 搜索结果中显示

backup - 如何在不关闭 Jackrabbit 的情况下备份 apache Jackrabbit 存储库?

java - 数据库查询直接在 DBMS 上工作,但不在 Java 中工作

java - 如何在不是 Activity 的布局上暂时隐藏操作栏

aem - JCR 在 AEM 技术堆栈中的作用是什么?

java - 通过 JCR 实现基于标签的搜索系统的最佳方法,如 Modeshape

java - X509证书文件检查

java - RestController 在 RequestBody 中接收到错误的字符集