Guten abend,
ich habe folgendes Problem, un zwar beim Zugriff auf Properties aus einem Set wird eine Exception geworfen.
Ein geküztes Programm-Code möchte ich hier unten vorstellen.
Erste Klasse : Patient
Die zweite Klasse : Feedback
Meine Klassen sind wie folgt gemappt:
1.Klasse Patient
2.Klasse Feedback
In der Frontend-Schicht möchte ich die Daten über den Patienten und seine Feedbacks anzeigen, meine JSF-Seite sieht so aus:
Schön wäre es wenn es so funktionieren würde, leider wird folgendes Exception geworfen:
Ich bin Absolut neu in JSF und JSP, ich weiss nicht wie ich dieses Problem überwende.
Vielleicht muss ich hier List statt Set benutzen, stimmt mir jemand zu? Wenn ja wie geht's das?
Ich würde mich sehr freune über eine Antwort.
Danke im Voraus.
ich habe folgendes Problem, un zwar beim Zugriff auf Properties aus einem Set wird eine Exception geworfen.
Ein geküztes Programm-Code möchte ich hier unten vorstellen.
Erste Klasse : Patient
Code:
// Generated 20.12.2006 20:30:40 by Hibernate Tools 3.1.0.beta5
//imports …
/**
* Patient generated by hbm2java
*/
public class Patient implements java.io.Serializable {
// Fields
private int patientId;
private Set<Feedback> feedbacks = new
HashSet<Feedback>(0);
private Set<Chemotest> chemotests = new
HashSet<Chemotest>(0);
// Constructors
/** default constructor */
public Patient() {
}
// Property accessors
public int getPatientId() {
return this.patientId;
}
...
public Set<Feedback> getFeedbacks() {
return this.feedbacks;
}
public void setFeedbacks(Set<Feedback> feedbacks) {
this.feedbacks = feedbacks;
}
public Set<Chemotest> getChemotests() {
return this.chemotests;
}
public void setChemotests(Set<Chemotest> chemotests) {
this.chemotests = chemotests;
}
}
Code:
public class Feedback implements java.io.Serializable {
// Fields
private int feedbackId;
private Patient patient;
private String feedbackText;
private byte type;
private Date date;
// Constructors
/** default constructor */
public Feedback() {
}
// Property accessors
public int getFeedbackId() {
return this.feedbackId;
}
…
}
1.Klasse Patient
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 20.12.2006 20:30:41 by Hibernate Tools 3.1.0.beta5 -->
<hibernate-mapping>
<class name="ipis.domain.Patient" table="patient" catalog="ipis">
<comment></comment>
<id name="patientId" type="int">
<column name="patient_id" />
<generator class="assigned" />
</id>
<set name="feedbacks" inverse="true">
<key>
<column name="patient_id" not-null="true">
<comment></comment>
</column>
</key>
<one-to-many class="ipis.domain.Feedback" />
</set>
<set name="chemotests" inverse="true">
<key>
<column name="patient_id" not-null="true">
<comment></comment>
</column>
</key>
<one-to-many class="ipis.domain.Chemotest" />
</set>
</class>
</hibernate-mapping>
2.Klasse Feedback
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 20.12.2006 20:30:41 by Hibernate Tools 3.1.0.beta5 -->
<hibernate-mapping>
<class name="ipis.domain.Feedback" table="feedback" catalog="ipis">
<comment></comment>
<id name="feedbackId" type="int">
<column name="feedback_id" />
<generator class="increment" />
</id>
<many-to-one name="patient" class="ipis.domain.Patient" fetch="select">
<column name="patient_id" not-null="true">
<comment></comment>
</column>
</many-to-one>
<property name="feedbackText" type="string">
<column name="feedback_text" length="65535" not-null="true">
<comment></comment>
</column>
</property>
</class>
</hibernate-mapping>
In der Frontend-Schicht möchte ich die Daten über den Patienten und seine Feedbacks anzeigen, meine JSF-Seite sieht so aus:
Code:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
<%@ include file="../base/includeHeader.jsp" %>
<body>
<f:view>
<%@ include file="top.jsp"%>
<h2>My data</h2>
<h:form id="form">
<table>
<h:dataTable value="#{patientAction.currentPatient}" var="patient"
border="1" >
<h:column>
<h:outputText value="Identifier" />
</h:column>
<h:column>
<h:outputText value="#{patient.patientId}" />
</h:column>
<h:column>
<h:dataTable value="#{patient.feedbacks}" var="feedbacks"
border="1">
<h:column>
<h:outputText value="#{feedbacks.type}" />
</h:column>
</h:dataTable>
</h:column>
</h:dataTable>
</table>
</h:form>
</f:view>
</body>
</html>
Schön wäre es wenn es so funktionieren würde, leider wird folgendes Exception geworfen:
Code:
2007-01-22 15:26:02,317 ERROR [org.apache.myfaces.shared_impl.renderkit.RendererUtils] - Property not found - called by component : {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /ipis-jsp/mydata.jsp][Class: javax.faces.component.html.HtmlForm,Id: form][Class: javax.faces.component.html.HtmlDataTable,Id: _idJsp5][Class: javax.faces.component.UIColumn,Id: _idJsp10][Class: javax.faces.component.html.HtmlDataTable,Id: _idJsp11][Class: javax.faces.component.UIColumn,Id: _idJsp12][Class: javax.faces.component.html.HtmlOutputText,Id: _idJsp13]}
javax.faces.el.PropertyNotFoundException: Bean: org.hibernate.collection.PersistentSet, property: type
at org.apache.myfaces.el.PropertyResolverImpl.getPropertyDescriptor(PropertyResolverImpl.java:483)
at org.apache.myfaces.el.PropertyResolverImpl.getPropertyDescriptor(PropertyResolverImpl.java:454)
at org.apache.myfaces.el.PropertyResolverImpl.getProperty(PropertyResolverImpl.java:417)
at org.apache.myfaces.el.PropertyResolverImpl.getValue(PropertyResolverImpl.java:82)
at org.apache.myfaces.el.ELParserHelper$MyPropertySuffix.evaluate(ELParserHelper.java:532)
at org.apache.commons.el.ComplexValue.evaluate(ComplexValue.java:145)
at org.apache.myfaces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:383)
at javax.faces.component.UIOutput.getValue(UIOutput.java:77)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getStringValue(RendererUtils.java:217)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.renderOutput(HtmlTextRendererBase.java:69)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.encodeEnd(HtmlTextRendererBase.java:57)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:536)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:442)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChildren(RendererUtils.java:419)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:440)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.renderColumnBody(HtmlTableRendererBase.java:212)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.encodeColumnChild(HtmlTableRendererBase.java:181)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.encodeInnerHtml(HtmlTableRendererBase.java:167)
at org.apache.myfaces.shared_impl.renderkit.html.HtmlTableRendererBase.encodeChildren(HtmlTableRendererBase.java:100)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:524)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:436)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChildren(RendererUtils.java:419)
at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:440)
…
…
…
Ich bin Absolut neu in JSF und JSP, ich weiss nicht wie ich dieses Problem überwende.
Vielleicht muss ich hier List statt Set benutzen, stimmt mir jemand zu? Wenn ja wie geht's das?
Ich würde mich sehr freune über eine Antwort.
Danke im Voraus.