Jsf java.lang.ClassCastException:java.util.Collections$UnmodifiableMap不能强制转换为参数
我正在尝试将转换器写入我的SelectOne菜单,我不想在其中选择对象。 我的对象(“Param”)类如下所示:Jsf java.lang.ClassCastException:java.util.Collections$UnmodifiableMap不能强制转换为参数,jsf,converter,selectonemenu,Jsf,Converter,Selectonemenu,我正在尝试将转换器写入我的SelectOne菜单,我不想在其中选择对象。 我的对象(“Param”)类如下所示: public class Param { private Integer id; private String name; public Param(Integer id, String name){ this.id = id; this.name = name; } public Integer getId(){ return this.id; } pu
public class Param {
private Integer id;
private String name;
public Param(Integer id, String name){
this.id = id;
this.name = name;
}
public Integer getId(){
return this.id;
}
public String getName(){
return this.name;
}
@Override
public boolean equals(Object object) {
return (object instanceof Param) && (id != null)
? id.equals(((Param) object).getId())
: (object == this);
}
@Override
public int hashCode() {
return (id != null)
? (this.getClass().hashCode() + id.hashCode())
: super.hashCode();
}
}
豆子:
我认为getAsString方法获取不可修改的Map对象作为值,但它应该是Param对象,对吗
请帮帮我
如果我犯了一些错误,我对我的英语感到抱歉;P
在这里检查工作代码,并尝试自己找出错误。它会让你牢牢记住它:)
子类别转换器:@ManagedBean(name = "subcategoryConverterBean")
@FacesConverter(value = "subcategoryConverter")
public class SubcategoryConverter implements Converter {
@PersistenceContext()
private transient EntityManager em;
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
// TODO Auto-generated method stub
System.out.println("wybrales: " + value);
Query query = em.createQuery("SELECT c FROM Subcategory c WHERE c.subId=?1");
query.setParameter("1", Integer.parseInt(value));
return query.getSingleResult();
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
// TODO Auto-generated method stub
return ((String) String.valueOf(((Subcategory) value).getSubId()));
}
}
最后是categoryListBean:
@ManagedBean
public class CategoryListBean {
private List<CategoryBean> category;
private List<SubcategoryBean> subcategory;
@EJB
CategoryEAO service;
public List<CategoryBean> getCategory() {
category = service.getCategories();
return category;
}
public void setCategory(List<CategoryBean> category) {
this.category = category;
}
public List<SubcategoryBean> getSubcategory() {
subcategory = service.getSubcategories();
return subcategory;
}
public void setSubcategory(List<SubcategoryBean> subcategory) {
this.subcategory = subcategory;
}
}
@ManagedBean
公共类CategoryListBean{
私人名单类别;
私有列表子类别;
@EJB
分类服务;
公共列表getCategory(){
category=service.getCategories();
退货类别;
}
公共类别(列表类别){
this.category=类别;
}
公共列表getSubcategory(){
subcategory=service.getSubcategories();
返回子类别;
}
公共无效集合子类别(列表子类别){
this.subcategory=子类别;
}
}
我将重点介绍getAsObject方法,因为它看起来不像您想象的那样获取Param对象问题在于
var
属性
<f:selectItems value="#{mainBean.params}"
var="param"
itemValue="#{param}"
itemLabel="#{param.name}"
/>
您的转换器虽然有点笨重,也不完全坚固,但完全正常。第40行有什么内容?你能概述它在哪里吗?在getAsString方法中:“Param Param=(Param)value;”谢谢:-)我自己不会得到这个:P
HTTP Status 500 - java.util.Collections$UnmodifiableMap cannot be cast to Param
--------------------------------------------------------------------------------
type Exception report
message java.util.Collections$UnmodifiableMap cannot be cast to Param
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: java.util.Collections$UnmodifiableMap cannot be cast to Param
javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
root cause
java.lang.ClassCastException: java.util.Collections$UnmodifiableMap cannot be cast to Param
ParamConverter.getAsString(ParamConverter.java:40)
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getFormattedValue(HtmlBasicRenderer.java:521)
com.sun.faces.renderkit.html_basic.MenuRenderer.renderOption(MenuRenderer.java:534)
com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:794)
com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:847)
com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:297)
javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903)
javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:115)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1896)
javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1896)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:451)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
<h:selectOneMenu rendered="#{categoryConverterBean.rendered}" class="subcategory" id="subcategory" converter="#{subcategoryConverterBean}" value="#{auctionBean.subCategory}">
<f:selectItems
value="#{categoryListBean.subcategory}"
var="subcategory"
itemLabel="#{subcategory.subName}"
itemValue="#{subcategory}"
/>
</h:selectOneMenu>
public Subcategory getSubCategory() {
return subCategory;
}
public void setSubCategory(Subcategory subCategory) {
this.subCategory = subCategory;
}
@ManagedBean(name = "subcategoryConverterBean")
@FacesConverter(value = "subcategoryConverter")
public class SubcategoryConverter implements Converter {
@PersistenceContext()
private transient EntityManager em;
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
// TODO Auto-generated method stub
System.out.println("wybrales: " + value);
Query query = em.createQuery("SELECT c FROM Subcategory c WHERE c.subId=?1");
query.setParameter("1", Integer.parseInt(value));
return query.getSingleResult();
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
// TODO Auto-generated method stub
return ((String) String.valueOf(((Subcategory) value).getSubId()));
}
}
@ManagedBean
public class CategoryListBean {
private List<CategoryBean> category;
private List<SubcategoryBean> subcategory;
@EJB
CategoryEAO service;
public List<CategoryBean> getCategory() {
category = service.getCategories();
return category;
}
public void setCategory(List<CategoryBean> category) {
this.category = category;
}
public List<SubcategoryBean> getSubcategory() {
subcategory = service.getSubcategories();
return subcategory;
}
public void setSubcategory(List<SubcategoryBean> subcategory) {
this.subcategory = subcategory;
}
}
<f:selectItems value="#{mainBean.params}"
var="param"
itemValue="#{param}"
itemLabel="#{param.name}"
/>
<f:selectItems value="#{mainBean.params}"
var="_param"
itemValue="#{_param}"
itemLabel="#{_param.name}"
/>