吊索@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