ich dieses @Startup EJB haben, die liest und schreibt in eine .properties-Datei auf den Classpath verschiedenen Anwendungskonfigurationsvariablen:Startup EJB nicht injiziert, wenn ein SessionScope CDI Bean initialisiert
@Singleton
@Startup
@Production
public class CompanyPropertiesImpl implements CompanyProperties {
...
public CompanyPropertiesImpl() {
uriProperties = PropertiesProvider.getUriProperties();
...
}
Es wird dann in eine injiziert Session Scoped CDI Bean, die mit einer UI Webseite interagiert:
@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;
}
ich habe die if-Anweisung in den UriSetterBean Konstruktor eingefügt meinen Verdacht zu bestätigen - die EJB ist null auf der CDI Konstruktion. Allerdings, wenn ich auf die oben genannten UI Webseite und rufen Sie die updateUriProperties Methode der EJB-Ebene ist nicht mehr 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>
Dies ist jedoch keine akzeptable Lösung für mich. Deshalb.
UriSetterBean soll nur von einem Benutzer in der Rolle SUPERUSER aktualisiert werden. Aber ich benutze den Eigenschaftenacquisitor getJavascriptLink() von UriSetterBean auf einer anderen Seite, die von einem Benutzer in der Rolle ADMIN verwendet wird. Der Befehl getJavascriptLink() gibt die Basis-URL für Ruhedienste aus.
Wie kann ich "erzwingen" die EJB CompanyPropertiesImpl auf die Initialisierung von UriSetterBean initialisieren? Danke für Ihre Aufmerksamkeit und Aufmerksamkeit. Mir ist klar, dass es nicht trivial sein kann.
Injection stattfindet ** nach ** der Konstruktor aufgerufen wurde. Ist das dein Problem? Verwenden Sie dann eine Annotated-Methode von @PostConstruct. Wenn nicht, finde ich es schwer zu verstehen, was dein eigentliches Problem ist. – Kukeltje
Vielen Dank! Es klingt wie es, aber wie benutze ich es? Ich kann nicht neue CompanyPropertiesImpl() in der Init-Methode (mit PostConstruct annotiert). Nach alle EJB wird beim Start der Anwendung erstellt. Kann ich es gewaltsam von irgendwo abrufen? Sie können Ihren Kommentar in die Antwort schreiben. Du hast die Idee. – vasigorc
Keine Notwendigkeit, ein "neues" zu tun, einfach versuchen. Der EJB wird da sein – Kukeltje