吊索@Inject NullPointerError,当@Reference成功时
Sling @Inject NullPointerError, When @Reference Successful
当尝试 @Inject
(javax.inject.Inject) 在 @SlingServlet MyServlet
中注入 MyConfigurationService
时,任何时候在 [=17 上尝试任何操作都会导致 NullPointerError
=] 在 AEM OSGi 容器中使用 Maven org.apache.felix.maven-scr-plugin
作为构建过程的一部分。
服务实施:
@Service({MyConfigurationService.class})
@Component(immediate = true, metatype = true, label = "My Configuration Service")
public class MyConfigurationServiceImpl implements MyConfigurationService {
@Property(unbounded = PropertyUnbounded.DEFAULT, label = "API URL", description = "API URL")
private static final String API_URL = "apiurl";
private String apiUrl;
@Activate
protected void activate(Map<String, Object> properties) {
this.apiUrl = PropertiesUtil.toString(properties.get(API_URL), "");
}
}
Servlet:
@SlingServlet(paths = "/bin/myServlet", methods = "POST", metatype = true)
public class MyServlet extends org.apache.sling.api.servlets.SlingAllMethodsServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(MyServlet.class);
@Inject
MyConfigurationService myConfigurationService;
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException, IOException {
// any attempts to use myConfigurationService results in NPE
}
}
然而,使用 @Reference
(org.apache.felix.scr.annotations.Reference) 代替 @Inject
可以成功注入服务,并且可以在 @SlingServlet
方法中使用,例如 doPost
:
@Reference
MyConfigurationService myConfigurationService;
为什么 @Inject
无法在 @Reference
工作时将服务注入 @SlingServlet
?
感谢您提供的任何帮助!
我认为您将 sling 模型 @Inject 与 maven SCR 插件使用的 SCR 注释混淆了。
maven SCR 插件定义要在 build time
处处理的注释,这些注释在此处定义:http://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.html
所有这些注释都在 org.apache.felix.scr.annotations
包下
@Reference 注释只能与@Component、@service、@SlingServlte 或任何其他定义 OSGI 组件的 SCR class 注释一起使用。
javax.inject.Inject
注解是通用的,被许多框架用于依赖注入。在 AEM 或 Sling 的情况下,它仅表示 Sling 模型内部的某些内容(由 org.apache.sling.models.annotations.Model
注释的 class),请在此处阅读有关 @Inject 和其他可在 Sling 模型中使用的注释的更多信息:https://sling.apache.org/documentation/bundles/models.html#basic-usage
当尝试 @Inject
(javax.inject.Inject) 在 @SlingServlet MyServlet
中注入 MyConfigurationService
时,任何时候在 [=17 上尝试任何操作都会导致 NullPointerError
=] 在 AEM OSGi 容器中使用 Maven org.apache.felix.maven-scr-plugin
作为构建过程的一部分。
服务实施:
@Service({MyConfigurationService.class})
@Component(immediate = true, metatype = true, label = "My Configuration Service")
public class MyConfigurationServiceImpl implements MyConfigurationService {
@Property(unbounded = PropertyUnbounded.DEFAULT, label = "API URL", description = "API URL")
private static final String API_URL = "apiurl";
private String apiUrl;
@Activate
protected void activate(Map<String, Object> properties) {
this.apiUrl = PropertiesUtil.toString(properties.get(API_URL), "");
}
}
Servlet:
@SlingServlet(paths = "/bin/myServlet", methods = "POST", metatype = true)
public class MyServlet extends org.apache.sling.api.servlets.SlingAllMethodsServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(MyServlet.class);
@Inject
MyConfigurationService myConfigurationService;
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException, IOException {
// any attempts to use myConfigurationService results in NPE
}
}
然而,使用 @Reference
(org.apache.felix.scr.annotations.Reference) 代替 @Inject
可以成功注入服务,并且可以在 @SlingServlet
方法中使用,例如 doPost
:
@Reference
MyConfigurationService myConfigurationService;
为什么 @Inject
无法在 @Reference
工作时将服务注入 @SlingServlet
?
感谢您提供的任何帮助!
我认为您将 sling 模型 @Inject 与 maven SCR 插件使用的 SCR 注释混淆了。
maven SCR 插件定义要在 build time
处处理的注释,这些注释在此处定义:http://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations.html
所有这些注释都在 org.apache.felix.scr.annotations
@Reference 注释只能与@Component、@service、@SlingServlte 或任何其他定义 OSGI 组件的 SCR class 注释一起使用。
javax.inject.Inject
注解是通用的,被许多框架用于依赖注入。在 AEM 或 Sling 的情况下,它仅表示 Sling 模型内部的某些内容(由 org.apache.sling.models.annotations.Model
注释的 class),请在此处阅读有关 @Inject 和其他可在 Sling 模型中使用的注释的更多信息:https://sling.apache.org/documentation/bundles/models.html#basic-usage