有没有办法在不由 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 组件。在所有这些入口点中,至少有一种方法可以访问存储库:
- JSP
- 使用
resourceResolver
绑定(bind) - 使用
getService(ResourceResolverFactory.class)
创建管理解析器,
- 使用
- Servlet 或过滤器
- 使用
request.getResourceResolver()
获取请求 session , - 或者看下一点。
- 使用
- 任何 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/