我有这个@Startup EJB,它读取和写入类路径上不同的应用程序配置变量的.properties文件:
@Singleton
@Startup
@Production
public class CompanyPropertiesImpl implements CompanyProperties {
...
public CompanyPropertiesImpl() {
uriProperties = PropertiesProvider.getUriProperties();
...
}
然后将其注入Session Scoped CDI Bean,它与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构造函数中以确认我的怀疑 - 在CDI构造中EJB为null。但是,如果我导航到上面提到的UI网页并调用updateUriProperties方法,则EJB不再为null:
<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中的用户更新。但是我在角色ADMIN中的用户使用的另一个页面中使用UriSetterBean的getJavascriptLink()属性访问器。 getJavascriptLink()输出休息服务的基本URL。
如何在UriSetterBean初始化时“强制”初始化EJB CompanyPropertiesImpl?感谢您的关注和考虑。我意识到这可能不是微不足道的。
答案 0 :(得分:0)
添加@PostConstruct注释方法并从EJB中重新提供所需的值:
@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";
}