Hi,
ich versuche ein Primeface Projekt zum laufen zu bekommen und scheiter momentan, dass eine @ManagedProperty annotation nicht so will.
Ich habe folgende Beanklasse
private static final long serialVersionUID = 123134245245211L;
private String email;
private String name;
@ManagedProperty(value = "#{service}")
private HumanService service;
public void setService(HumanService service) {
this.service = service;
}
public String getName() {
return service.getName();
}
//... getters and setters
der Service dazu schaut
@ApplicationScoped
public class HumanService implements Serializable {
private static final long serialVersionUID = 7134613451341634171L;
public String getName() {
return "foobar"; // mit irgendeiner Implementierung
}
}```
sowie eine ManagedBean
```@ManagedBean(name = "mankind")
public class MankindService {
private final List<Human> humans = new ArrayList<>();
@PostConstruct
public void init() {
final Human e = new Human();
humans.add(e);
}
public List<Human> getHumans() {
return humans;
}
}```
und die index.xhtml
[XML]<h:body>
<h:form>
<p:tabView>
<p:tab title="Overview">
<p:dataTable var="h" value="#{mankind.humans}">
<p:column headerText="Name">
<h:outputText value="#{h.name}" />
</p:column>
</p:tab>
</p:tabView>
</h:form>
</h:body>[/XML]
Beim Aufruf kommt nun
**An error occurred performing resource injection on managed bean mankind**
incl StackTrace, der zeigt, dass service nicht injected wurde.
wenn ich mir [Injecting Managed beans in JSF 2.0](http://www.mkyong.com/jsf2/injecting-managed-beans-in-jsf-2-0/) anschaue, scheint es aber so einfach zu sein... was ist bei mir falsch ?
Thanks
Hmm,
ich glaube, alle @ManagedBean Beans brauchen auch einen Scope. Ansonsten würde ich das Problem nicht beheben, sondern direkt auf CDI umstellen. Die Standard-JSF-Annotationen sind deprecated und sollen durch CDI (wenn möglich) ersetzt werden.
Ist zwar schon etwas länger her bei mir aber du versuchst ja @ManagedProperty in einem Pojo (unmanaged) anzuwenden.
Ich kenn das nur, wie im Beispiel (dein Link), dass man eine ManagedBean in eine andere ManagedBean injected mit @ManagedProperty.
(Also wie es auch im Beispiel steht “In JSF 2.0, a new @ManagedProperty annotation is used to dependency injection (DI) a managed bean into the property of another managed bean.”)
Weiterhin haben ManagedBeans defaultmäßig Request Scope also kein MUSS eines Scopes.
Als kleines Beispiel das funktioniert z.b. (natürlich ne schlechte Lösung, aber nur zur Demo ;))
(Bei dem Primefaces- Code muss natürlich noch die Tabelle geschlossen werden)
public class MankindService {
private final List<Human> humans = new ArrayList<>();
@ManagedProperty(value = "#{service}")
private HumanService service;
public void setService(HumanService service) {
this.service = service;
}
@PostConstruct
public void init() {
final Human e = new Human(service);
humans.add(e);
}
public List<Human> getHumans() {
return humans;
}
}```
```public class Human implements Serializable {
private static final long serialVersionUID = 123134245245211L;
private String email;
private String name;
private HumanService service;
public Human(HumanService serv) {
service = serv;
}
public String getName() {
return service.getName();
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}```
[QUOTE=Sym]Hmm,
ich glaube, alle @ManagedBean Beans brauchen auch einen Scope. Ansonsten würde ich das Problem nicht beheben, sondern direkt auf CDI umstellen. Die Standard-JSF-Annotationen sind deprecated und sollen durch CDI (wenn möglich) ersetzt werden.[/QUOTE]
versuche ich gerade und ist schrecklich… für einen der keine Ahnung hat und im Netz nach Hilfe sucht ist es so was von frustrierend zig verschiedene Beispiele/Tutorials zu sehen, die scheinbar immer unterschiedliche Annotationen, Libraries etc verwenden und bei mir dann alle nicht funktionieren.
Lehre für jetzt - verzichte auf DI und initiiere alles einfach … ist nur ein verdammter Prototyp der da entstehen soll