Hi,
ich habe folgendes Problem:
ich möchte ein SelectOneMenu verwenden, um ne auswahl zu geben und das dann zu speichern.
da habe ich gelesen, dass man nen converter braucht, um die Objekte da richtig rauszubekommen. Nun hab ich einen Converter geschrieben. Allerdings dann auch erfahren, dass es erst am JSF 2.2 möglich ist Beans in diesen zu injecten. (Ich verwende nur die jsf-api von com.sun.faces version 2.0.2 und das upgraden scheint ziemlich kompliziert.. da geht dann gar nichts mehr).
also habe ich versucht das anders zu machen. wenn ich die verwendete DAO im converter selbst mit new ... instanziiere, dann klappt das soweit. Nur in der DAO selbst bekommt er dann keinen EntityManager, der eigentlich automatisch injected sein müsste. (und bei andren methodenaufrufen über einen Service klappt das auch. die DAO ist also in Ordnung).
Der Converter (ein paar von meinen Lösungsversuchen sind da auskommentiert):
ein Teil aus der Entity:
ein Teil aus der xhtml:
aus der DAO:
wenn ihr sonst noch infos braucht...
danke schon ma für die mühe...
ach ja ich frag mich auch, ob ich eigentlich wirklich einen Converter brauche? bevor ich einen hatte, konnte ich die Entities immerhin ja anzeigen, nur habe ich da immer nur null herausbekommen beim speichern. Lag das daran, dass der Converter gefehlt hat oder mach ich die ganze mühe umsonst?
Bzw. findet ihr es klüger die JSF version irgendwie zu ändern? (und wenn ja wie stell ich das am geschicktesten an und was muss ich so ändern?)
ich habe folgendes Problem:
ich möchte ein SelectOneMenu verwenden, um ne auswahl zu geben und das dann zu speichern.
da habe ich gelesen, dass man nen converter braucht, um die Objekte da richtig rauszubekommen. Nun hab ich einen Converter geschrieben. Allerdings dann auch erfahren, dass es erst am JSF 2.2 möglich ist Beans in diesen zu injecten. (Ich verwende nur die jsf-api von com.sun.faces version 2.0.2 und das upgraden scheint ziemlich kompliziert.. da geht dann gar nichts mehr).
also habe ich versucht das anders zu machen. wenn ich die verwendete DAO im converter selbst mit new ... instanziiere, dann klappt das soweit. Nur in der DAO selbst bekommt er dann keinen EntityManager, der eigentlich automatisch injected sein müsste. (und bei andren methodenaufrufen über einen Service klappt das auch. die DAO ist also in Ordnung).
Der Converter (ein paar von meinen Lösungsversuchen sind da auskommentiert):
Java:
//@Component
//@Scope("request")
@FacesConverter("com.barbeit.web.converter.StudentConverter")
public class StudentConverter implements Converter{
// @Autowired //hat nicht funktioniert
private static StudentDAOImpl studentDAO = new StudentDAOImpl();
@Override
// @Transactional (readOnly = false)
public Object getAsObject(FacesContext context, UIComponent component, String newValue) {
// Convert the unique String representation of Student to the actual Student object.
//Ausgaben zum Ueberpruefen:
System.out.println("new value(als String): "+ newValue);
String s;
if (studentDAO == null){
s="keine studentDAO";
} else { s="okay";}
System.out.println("studentDAO: " + s);
int i = Integer.parseInt(newValue);
System.out.println("als Integer: "+i);
return studentDAO.getById(Integer.parseInt(newValue));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
// Convert the Student object to its unique String representation.
return String.valueOf(((Student) value).getId());
}
public static StudentDAO getStudentDAO() {
return studentDAO;
}
public static void setStudentDAO(StudentDAOImpl studentDAO) {
StudentConverter.studentDAO = studentDAO;
}
}
ein Teil aus der Entity:
Java:
// This must return true for another Student object with same id.
@Override
public boolean equals(Object other) {
if (other == null) {
return false;
} else if (!(other instanceof Student)) {
return false;
} else if (Integer.toString(((Student) other).getId()).equals(Integer.toString(this.id))) {
return true;
} else {
return false;
}
}
// This must return the same hashcode for every Student object with the same id.
@Override
public int hashCode() {
return id != 0 ? this.getClass().hashCode() + id : super.hashCode();
}
ein Teil aus der xhtml:
HTML:
<h:outputLabel for="StudentMenu" value="Student (bis Student ueberg. funkt.): *" />
<p:selectOneMenu id="StudentMenu" value="#{effortService.stud}" effect="fade">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{effortService.students}" var="Student"
itemLabel="#{Student.rzPerson.name}, #{Student.rzPerson.firstName}"/>
</p:selectOneMenu>
aus der DAO:
Java:
@Repository("studentDAO")
@Scope(value="request")
public class StudentDAOImpl implements StudentDAO{
@PersistenceContext
private EntityManager em;
//getter und setter und andere CRUD methoden
public Student getById(int id) {
//Ausgaben zum ueberpruefen:
System.out.println("id: "+ id);
String s;
if (em == null){
s="kein EntityManager!";
} else { s="okay";}
System.out.println("EntityManager: " + s);
return getEntityManager().find(Student.class, id);
}
wenn ihr sonst noch infos braucht...
danke schon ma für die mühe...
ach ja ich frag mich auch, ob ich eigentlich wirklich einen Converter brauche? bevor ich einen hatte, konnte ich die Entities immerhin ja anzeigen, nur habe ich da immer nur null herausbekommen beim speichern. Lag das daran, dass der Converter gefehlt hat oder mach ich die ganze mühe umsonst?
Bzw. findet ihr es klüger die JSF version irgendwie zu ändern? (und wenn ja wie stell ich das am geschicktesten an und was muss ich so ändern?)
Zuletzt bearbeitet: