2015-11-02 29 views
0

我們遇到了一種奇怪的servlet注入行爲。首先的serlvet看起來如下:在Sling中奇怪的服務注入Servlet

@Service(Servlet.class) 
@Component(
     label = "Some Label", 
     description = "Some description", 
     metatype = true, 
     immediate = true 
) 
@Properties({ 
     @Property(name = "service.description", value = "some val"), 
     @Property(name = "service.vendor", value = "some val"), 
     @Property(name = "sling.servlet.paths", 
       value = { "/some/path" }, 
       propertyPrivate = false) 
}) 
public class RequestPasswordServlet extends SlingAllMethodsServlet { 

... 
    @Reference 
    private ValidateService validateService; 
... 
} 

和驗證服務:

@Component 
@Service 
public class ValidateServiceImpl implements ValidateService { 

... 
    @Reference 
    private Service1 service1; 

    @Reference 
    private Service2 service2; 
... 
} 

當請求到達這個servlet,validateService不爲空,但這項服務中的引用是空的,所以我得到NPE在某些時候。在OSGi控制檯中,我看到,這兩個組件都處於活動狀態,並且它們的引用已滿足。

還有一件更奇怪的事情 - 我們也有第二個servlet(只有像RegitrationServlet一樣的註釋)引用同一個ValidateService。當請求到達第二個servlet時,我可以看到,ValidateService中的引用是而不是 null。

所以我採取了堆轉儲,我發現有兩個類ValidateServiceImpl的對象,通常是可以的,因爲第二個可以等待GC刪除它。但是在這個轉儲中,我可以看到,該servlet引用了不同的實例,真是奇怪。

在這兩個servlet中,我都爲此服務編寫了構造函數和綁定/取消綁定方法。包的部署過程中的輸出是:

2015-11-02 15:57:15.127 ERROR [com.package.registration.RegistrationServlet] Unbinding ValidateService 
2015-11-02 16:01:47.159 ERROR [com.package.registration.RegistrationServlet] Creating RegistrationServlet() 
2015-11-02 16:01:47.159 ERROR [com.package.registration.RegistrationServlet] Binding ValidateService 

2015-11-02 15:57:15.106 ERROR [com.package.security.RequestPasswordServlet] Unbinding ValidateService 
2015-11-02 16:01:47.104 ERROR [com.package.security.RequestPasswordServlet] Creating RequestPasswordServlet 
2015-11-02 16:01:47.104 ERROR [com.package.security.RequestPasswordServlet] Binding ValidateService 
2015-11-02 16:02:06.861 ERROR [com.package.security.RequestPasswordServlet] Unbinding ValidateService 
2015-11-02 16:02:07.348 ERROR [com.package.security.RequestPasswordServlet] Creating RequestPasswordServlet 
2015-11-02 16:02:07.348 ERROR [com.package.security.RequestPasswordServlet] Binding ValidateService 

所以RequestPasswordServlet(其中有引用正確的服務之一)越來越束部署中創建了兩次,我不明白爲好。

整個這個故事可以與未來事實:

  • 我們的項目在AEM 5.6.1運行與SP 2版本的
  • org.apache.felix.framework是4.2.0
  • 我們搬到了JAVA 8和更新DEPS /插件的某些版本中我們的POM文件:從1.6.0
    • org.apache.felix.scr.annotations到1.9.0
    • 行家-SCR-插件從1.7.4到1.20.0
    • 從2.3.7至2.5.4
    • 行家編譯-插件行家束-插件從2.3.2至3.1

根據this link版本org.apache.felix.scr.annotations行家-SCR-plugi,我們在我們的項目中使用,是不兼容的,所以我試圖將其更改爲1.9.8和1.21.0,但沒有運氣。重現

而且我的步驟:

  • 明確的安裝文件夾(除去我們所有的包)
  • 重啓AEM例如
  • 安裝包1(帶版本,當我們第一次遇到這個問題)
  • 安裝package2任何較新的包
  • 檢查問題是否存在

重新啓動軟件包/組件有助於解決問題,但我們希望找到造成這種奇怪行爲的原因並對其進行修復。

任何想法發生了什麼或在哪裏看下一個?

Upd1:我們也有其他servlet/jsp頁面的問題。此外,它似乎,設置立即=真ValidateServiceImpl解決了這個問題(但不是100%肯定),但這種行爲對我來說並不清楚。

+0

你爲什麼自己寫綁定/解除綁定方法? scr插件會爲你生成它們。此外,使參考'volatile'可能會有所幫助 –

+0

我可能無法解釋問題的原因,但在我更新我們的pom.xml中的依賴關係時遇到了類似的問題。其中一些版本有不一致之處。我們的版本如下: org.apache.felix.scr.annotations 1.9.12; maven-scr-plugin 1.14.0; maven-bundle-plugin 2.4.0;不使用maven-compiler-plugin。 –

+0

@RobertMunteanu,我寫了bind/unbind方法來獲得一些調試信息。問題在那裏,當他們失蹤時也是如此。 –

回答

0

我認爲AEM 5.6.1對於Java 8而言是不穩定的:)。 AEM> 6.1將會很好java 8.