JSF/JPA-Fehler: Die Klasse 'java.lang.String' nicht die Eigenschaft haben
Ich bin anzeigen einer Liste der Fußball-Spieler aus einer Datenbank, die der Benutzer auswählen kann, und fügen Sie zu einer ArrayList. Anzeige aller Spieler funktioniert gut, aber nicht für den ausgewählten. Wenn ich ihn für den nur-Objekt oder seinen hashcode, seine Erträge sein, aber sobald ich mich auf eine Eigenschaft in Bezug auf die Player-Einheit, gibt es einen Fehler. Wer?
Backing bean
@Named
@SessionScoped
public class PlayerBean implements Serializable {
private static final long serializableUID = 1L;
@Inject
PlayerFacade facade;
private List<Player> allPlayers;
private List<Player> selectedPlayers;
public PlayerBean() {
}
public List<Player> getAllPlayers() {
return facade.findAll();
}
public List<Player> getSelectedPlayers() {
return selectedPlayers;
}
public void setSelectedPlayers(List<Player> selectedPlayers) {
this.selectedPlayers= selectedPlayers;
}
}
Entity-Klasse
@Entity
@Table(name = "player")
@XmlRootElement
public class Player implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "PlayerID")
private Integer playerID;
@Size(max = 45)
@Column(name = "Name")
private String name;
@Size(max = 45)
@Column(name = "Position")
private String position;
//@Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
@Column(name = "Weight")
private BigDecimal weight;
public Player() {
}
public Player(Integer playerID) {
this.playerID = playerID;
}
public Integer getPlayerID() {
return playerID;
}
public void setPlayerID(Integer playerID) {
this.playerID = playerID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
public BigDecimal getWeight() {
return weight;
}
public void setWeight(BigDecimal weight) {
this.weight = weight;
}
@Override
public int hashCode() {
int hash = 0;
hash += (playerID != null ? playerID.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
//TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Player)) {
return false;
}
Player other = (Player) object;
if ((this.playerID == null && other.playerID != null) || (this.playerID != null && !this.playerID.equals(other.playerID))) {
return false;
}
return true;
}
@Override
public String toString() {
return "playerID=" + playerID + " ]";
}
}
JSF-Seite
<h:form id="allPlayers" style="text-align: center;" >
<h:selectManyCheckbox value="#{playerBean.selectedPlayers}">
<f:selectItems value="#{playerBean.allPlayers}" var="p" itemLabel="#{p.name} #{p.position} #{p.weight}" />
</h:selectManyCheckbox>
<h:commandButton value="Add to Team" action="team"/>
</h:form>
</p>
<p>
<h:form id="selectedPlayers" style="text-align: center;" >
<h:dataTable value="#{playerBean.selectedPlayers}" var="players">
<h:column>
#{players}
</h:column>
<h:column>
#{players.name}
</h:column>
</h:dataTable>
<h:commandButton value="Set Team" action="team"/>
</h:form>
Fehlermeldung
javax.el.ELException: /team.xhtml: The class 'java.lang.String' does not have the property 'name'.
at com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:88)
at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302)
at com.sun.faces.renderkit.html_basic.TableRenderer.renderRow(TableRenderer.java:385)
at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:162)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:724)
in Zeile: "<f:selectItems value="#{playerBean.allPlayers}" var="p" itemLabel="#{p.name} #{p.position} #{p.Gewicht}" /> kann es wirklich enthalten eine Liste als nur eine option, die soll einen string der nur so p, string
InformationsquelleAutor user3093851 | 2013-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie verstehen Ihr problem, wenn Sie berücksichtigen, die folgenden Begriffe:
List<Player>
. Als Werte wird die Einstellung über die EL, die Laufzeit und Reflexion basieren. Von dem moment an EL macht seinen job, geben Sie Informationen über Ihre Sammlung haben Sie diese bereits gelöscht und es werden plainList
.itemValue
Attribut<f:selectItems>
tag, so dass ich denke, dass es geschrieben, nachdem Sie die form Einreichen, um den Standardwert, der wahrscheinlichp,toString()
in Ihrem Fall.Wenn Sie den code Debuggen und schauen was vorgelegt wurde, werden Sie sehen, dass Ihre Liste war in der Tat bevölkert von strings. Jetzt sollten Sie verstehen, die Ursache des Problems und die Ausnahme, die ausgelöst wird, denn es ist wirklich keine Eigenschaft name im
String
Klasse.Als die Lösung im Grunde gibt es zwei Dinge, die getan werden, um die Dinge zu arbeiten:
itemValue
von<f:selectItems>
tag explizit alsitemValue="#{p}"
zu sagen, JSF, zu erwarten, dass Ihre Spieler-Instanz;Converter
explizit, indem man zum Beispielconverter
Attribut<h:selectManyCheckbox>
tag. Diese kann getan werden, indem Sie Ihre eigenen@FacesConverter
Klasse, oder, wenn Sie nichts dagegen haben mit den hervorragenden OmniFaces JSF utility library, nutzen Sie einfach IhreSelectItemsConverter
alsWandler="omnifaces.SelectItemsConverter"
. Dies ermöglicht JSF zu füllen in der angegebenen Klasse Instanzen in Ihre Liste gesichert.InformationsquelleAutor skuntsel