2016-08-01 93 views
0

我有這個@Startup EJB其讀取和寫入一個屬性文件類路徑上的不同的應用配置變量:啓動EJB不注射時SessionScope CDI Bean的初始化

@Singleton 
@Startup 
@Production 
public class CompanyPropertiesImpl implements CompanyProperties { 
... 
public CompanyPropertiesImpl() { 
    uriProperties = PropertiesProvider.getUriProperties(); 
    ... 
} 

它然後注入會話範圍CDI豆,其與UI網頁交互:

@Named(value = "companyPropertiesBean") 
@SessionScoped 

public class UriSetterBean implements Serializable { 
... 

@Inject 
@Production 
private CompanyProperties companyProperties; 

public UriSetterBean() { 
    this.urisUpdated = false; 
    this.updateTried = false; 
    serviceSuffix = "/RimmaNew/rest"; 
    if (companyProperties==null) { 
     System.out.println("true"); 
    }else{ 
     System.out.println("false"); 
    } 
} 

public void setCompanyProperties(CompanyProperties companyProperties) { 
    this.companyProperties = companyProperties; 
} 
... 
public void updateUriProperties() { 
    if (hostName == null || hostName.equals("") || schemeName == null || schemeName 
      .equals("")) { 
     updateTried = true; 
     urisUpdated = false; 
    } else { 
     companyProperties.setHostName(hostName); 
     companyProperties.setSchemeName(schemeName); 
     if (valueOf(port) == null || port != 0) { 
      companyProperties.setPort(port); 
     } else //i.e. port is not part of the uri 
     { 
      companyProperties.setPort(-1); 
     } 
     updateTried = true; 
     urisUpdated = true; 
    } 
... 
public String getJavascriptLink() { 
    updateJavascriptLink(); 
    return javascriptLink; 
} 

我已經粘貼if語句到UriSetterBean構造證實我的懷疑 - EJB是對CDI建設空。但是,如果我定位到上面提到的UI網頁並調用updateUriProperties方法的EJB不再爲空:

<h:commandButton action="#{companyPropertiesBean.updateUriProperties()}" class="btn btn-default" id="submitUriChanges" 
            style="margin-top: 0.5em" value="#{bigcopy.submitUriChanges}" 
            type="button"> 
         <f:ajax event="click" render="updateUriStatus" execute="@form"></f:ajax> 
        </h:commandButton> 

enter image description here

然而這不是我一個可接受的解決方案。這就是爲什麼。

UriSetterBean只能由角色SUPERUSER中的用戶更新。但是,我使用UriSetterBean的getJavascriptLink()屬性訪問器在角色ADMIN中的用戶使用的另一個頁面中。 getJavascriptLink()輸出休息服務的基礎URL。

如何在UriSetterBean初始化時「強制」初始化EJB CompanyPropertiesImpl?感謝您的考慮和關注。我意識到這可能不是微不足道的。

+0

注射發生後** **構造函數被調用。這是你的問題嗎?然後使用@PostConstruct註釋的方法。如果不是,我覺得很難理解你真正的問題是什麼。 – Kukeltje

+0

謝謝!聽起來像是這樣,但我該如何使用它?我不能在init方法中執行新的CompanyPropertiesImpl()(用PostConstruct註釋)。在應用程序啓動時創建所有EJB之後。我可以從某處強行檢索它嗎?你可以把你的評論放在'答案'中。你明白了。 – vasigorc

+0

不需要做一個'新',只是嘗試。 ejb將在那裏 – Kukeltje

回答

0

解決由Kukeltje

通過將@PostConstruct標註的方法,並從EJB retirieving所需的值:

@Named(value = "companyPropertiesBean") 
@SessionScoped 
public class UriSetterBean implements Serializable { 

    private String hostName, schemeName, serviceSuffix, javascriptLink; 
    private int port; 
    ... 

    @Inject 
    @Production 
    private CompanyProperties companyProperties; 

    //THE ADDED METHOD 
    @PostConstruct 
    public void init(){ 
     setHostName(companyProperties.getHostName()); 
     setSchemeName(companyProperties.getSchemeName()); 
     setPort(companyProperties.getPort()); 
    } 

    public UriSetterBean() { 
     this.urisUpdated = false; 
     this.updateTried = false; 
     serviceSuffix = "/RimmaNew/rest"; 
    }