java - 有没有办法在 POJO 中访问 SlingRepository?

标签 java osgi aem sling

有没有办法在不由 OSGI 管理的 POJO 中访问 SlingRepository

例如,我们可能有一个名为 Site 的 POJO:

public class Site {

    private String domainName;

    public String getDomainName() { return domainName; }

    public void setDomainName(String domainName) { this.domainName = domainName; }

    public void validate() throws Exception {
        SlingRepository repo = ...;
        // validation logic dependent on repo
    }
}

就是这样使用的:

Site site = new Site();
site.validate();



更新(关于 Tomek 的回答)

我不能使用 @Reference 或当前请求的 ResourceResolver 的原因是因为我正在尝试实现 JSR-303(又名 Bean 验证) validator 。

在我们的 Sling 应用程序中,我们有一堆从浏览器接收 JSON 负载的 servlet。然后我们将它们转换为 pojos:

Person p = new Gson().fromJson(json, Person.class)
validate(p); // Validate p using Bean Validation

Person 是一个带有 JSR-303 注释的简单 POJO:

public class Person {

    @NotNull
    private String name;

    @UniqueProperty(
      name = "email", 
      path = "/content/myapp", 
      nodeType = "cq:PageContent"
    )
    private String email;

}

简而言之,我的目标是实现@UniqueProperty 验证。在上面的示例中,如果 /content/myapp 下存在类型为 cq:PageContent 的节点,该节点的 email 属性的值与这个模型,验证失败。

validator 类本身如下所示:

public class UniquePropertyValidator implements ConstraintValidator<UniqueProperty, String {

    @Override
    public void initialize(UniqueProperty constraintAnnotation) {
        ...
    }

    @Override
    public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
        // need to execute a JCR query here
    }
}

UniquePropertyValidator 将根据需要由 JSR-303 实现(例如 Hibernate Validator)实例化,并且它无法访问当前请求的资源解析器,因此我一直在寻找一种方法来访问 SlingRepository

最佳答案

首先,如果您使用 Sling,那么使用 ResourceResolver 通常比 SlingRepository 更可取。它为您提供了一个有用的 Resource 抽象层,您仍然可以使用 adaptTo() 方法获取底层的 JCR Session 对象。

但是回到你的问题,POJO 总是存在于上下文中,有一些入口点运行整个事情。在 Sling 中有几个这样的地方:JSP、servlet 或 OSGi 组件。在所有这些入口点中,至少有一种方法可以访问存储库:

  1. JSP
    • 使用resourceResolver绑定(bind)
    • 使用 getService(ResourceResolverFactory.class) 创建管理解析器,
  2. Servlet 或过滤器
    • 使用request.getResourceResolver()获取请求 session ,
    • 或者看下一点。
  3. 任何 OSGi 服务(包括 servlet 或过滤器)
    • 使用 @Reference ResourceResolverFactory 获取工厂并创建管理解析器。

之后,您可以将资源解析器传递给您的 POJO 构造器。我认为这比对 FrameworkUtil 使用 hack 更好,原因如下:

  • 如果您将 ResourceResolver 传递给 POJO 构造函数,很明显这个特定类在存储库上运行,
  • 您无需担心关闭 session (因为 POJO 可能没有定义的生命周期),
  • 如果您在 servlet 或组件中创建 POJO(情况 1 和 2),最好使用请求的 session 以避免处理管理 session 。

关于java - 有没有办法在 POJO 中访问 SlingRepository?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26579820/

相关文章:

java - 通过 spring 注入(inject)属性访问,该属性引用目录以访问其文件

aem - 从页面树中捕获 AEM 包中的单个页面

java - 如何查看 Apache Felix Log 中未满足 bundle 要求的原因?

java - 在同一个 osgi 包中可以有两个服务接口(interface)吗?

javascript - 未捕获的语法错误 : Unexpected token (Script Ajax Call)

javascript - JS : Check if Sling resource exists without creating 404 error

java - 如何自动关闭JOptionPane?

java - 你可以在 Java play 框架中使用多线程吗?

java - 返回响应后,RequestContextHolder 中设置的属性丢失

java - 更改 Java Struts 应用程序中的默认文件结构