[英]Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to
I am still working on my h:selectOneMenu and I am able to produce a good list of values but the converter is not doing something right and I can not figure out the problem. 我仍然在h:selectOneMenu上工作,并且能够生成一个很好的值列表,但转换器执行的操作不正确,因此我无法找出问题所在。
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to com.ray.adtf.jpa.Gridmaster 引起原因:java.lang.ClassCastException:无法将java.lang.Long强制转换为com.ray.adtf.jpa.Gridmaster
THANK YOU for any help! 感谢您的任何帮助!
xhtml: XHTML:
<h:selectOneMenu id="mypick"
converter="#{categoryConverterBean}"
value="#{gridMaster_backing.pickedGrid}"
title="Test" >
<f:selectItems value="#{gridMaster_backing.gridList}" var="prog" itemValue="#{prog.gridid}" itemLabel="#{prog.gridid} - #{prog.program} - #{prog.project} - #{prog.ci}" />
</h:selectOneMenu>
jpa: JPA:
import java.io.Serializable;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.List;
/**
* The persistent class for the GRIDMASTER database table.
*
*/
@Entity
@NamedQuery(name="Gridmaster.findAll", query="SELECT g FROM Gridmaster g")
public class Gridmaster implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private long gridid;
private String ci;
@Column(name="\"PROGRAM\"")
private String program;
private String project;
public Gridmaster() {
}
public Long getGridid() {
return this.gridid;
}
public void setGridid(Long gridid) {
this.gridid = gridid;
}
public String getCi() {
return this.ci;
}
public void setCi(String ci) {
this.ci = ci;
}
public String getProgram() {
return this.program;
}
public void setProgram(String program) {
this.program = program;
}
public String getProject() {
return this.project;
}
public void setProject(String project) {
this.project = project;
}
Converter: 转换器:
import javax.faces.bean.ManagedBean;
import com.ray.adtf.jpa.Gridmaster;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
//You must annotate the converter as a managed bean, if you want to inject
//anything into it, like your persistence unit for example.
@ManagedBean(name = "categoryConverterBean")
@FacesConverter(value = "categoryConverter")
public class CategoryConverter implements Converter {
@PersistenceContext(unitName = "Test-Persistence")
// I include this because you will need to
// lookup your entities based on submitted values
private transient EntityManager em;
@Override
public Object getAsObject(FacesContext ctx, UIComponent component,
String value) {
// This will return the actual object representation
// of your Category using the value (in your case 52)
// returned from the client side
return em.find(Gridmaster.class, new Long(value));
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object o) {
//This will return view-friendly output for the dropdown menu
return ((Gridmaster) o).getGridid().toString();
}
}
backing bean: 支持豆:
public Long pickedGrid;
public Long getPickedGrid() {
return pickedGrid;
}
public void setPickedgrid(Long pickedGrid) {
this.pickedGrid = pickedGrid;
}
Stack Trace
javax.servlet.ServletException: java.lang.Long cannot be cast to com.ray.adtf.jpa.Gridmaster
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61)
io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113)
io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45)
io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61)
io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25)
io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240)
io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227)
io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73)
io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146)
io.undertow.server.Connectors.executeRootHandler(Connectors.java:177)
io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)
Can you try : long
type into int
type 你可以尝试:将long
类型转换为int
类型
@Id
private int gridid;
public int getGridid() {
return this.gridid;
}
public void setGridid(int gridid) {
this.gridid = gridid;
}
When you bind a Gridmaster
property to the selectOneMenu
, store it equally as object in the backing bean: 当您将Gridmaster
属性绑定到selectOneMenu
,将其作为对象平等存储在支持Bean中:
public Gridmaster pickedGrid;
public Gridmaster getPickedGrid() {
return pickedGrid;
}
public void setPickedgrid(Gridmaster pickedGrid) {
this.pickedGrid = pickedGrid;
}
because your converter does the job of converting the ID to an object so you don't have to store an ID. 因为您的转换器执行将ID转换为对象的工作,所以您不必存储ID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.