我有這個@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>
然而這不是我一個可接受的解決方案。這就是爲什麼。
UriSetterBean只能由角色SUPERUSER中的用戶更新。但是,我使用UriSetterBean的getJavascriptLink()屬性訪問器在角色ADMIN中的用戶使用的另一個頁面中。 getJavascriptLink()輸出休息服務的基礎URL。
如何在UriSetterBean初始化時「強制」初始化EJB CompanyPropertiesImpl?感謝您的考慮和關注。我意識到這可能不是微不足道的。
注射發生後** **構造函數被調用。這是你的問題嗎?然後使用@PostConstruct註釋的方法。如果不是,我覺得很難理解你真正的問題是什麼。 – Kukeltje
謝謝!聽起來像是這樣,但我該如何使用它?我不能在init方法中執行新的CompanyPropertiesImpl()(用PostConstruct註釋)。在應用程序啓動時創建所有EJB之後。我可以從某處強行檢索它嗎?你可以把你的評論放在'答案'中。你明白了。 – vasigorc
不需要做一個'新',只是嘗試。 ejb將在那裏 – Kukeltje