JSF转换器可以处理实现相同接口的不同类型的对象吗?
我有不同的对象,它们都实现了相同的接口。所有这些对象都需要通过JSF转换器可以处理实现相同接口的不同类型的对象吗?,jsf,jsf-2,Jsf,Jsf 2,我有不同的对象,它们都实现了相同的接口。所有这些对象都需要通过进行选择这些对象的默认值和选定值放在同一个地图中,很少有这样的地图在另一个地图中组合在一起。这听起来很复杂,但请看下面的代码,一切都会很清楚 当我选择一个对象时,converter从MyBean(CDIBean)获取所有对象的列表,通过uuidrequired对象查找并返回它,而不引发任何异常。当我尝试使用选定对象时,问题就开始了。例如,内部的这行代码: onObjectChange()方法来自MyBean: List<AllO
进行选择这些对象的默认值和选定值放在同一个地图
中,很少有这样的地图
在另一个地图
中组合在一起。这听起来很复杂,但请看下面的代码,一切都会很清楚
当我选择一个对象时,converter从MyBean(CDIBean)获取所有对象的列表,通过uuid
required对象查找并返回它,而不引发任何异常。当我尝试使用选定对象时,问题就开始了。例如,内部的这行代码:
onObjectChange()
方法来自MyBean
:
List<AllObjects> objects= objectContainer.getControllers().get("Object 1").get("selected");
事实上,当我将鼠标悬停在objectContainer
上时,我看到它包含类型为selected=[Ljava.lang.object;@dba1b6e7}
的对象,但当我在Eclipse的表达式面板中计算同一行代码时,我得到了所需的值:MyObject1@d8f0f5f8
一般来说,我不明白是否可以做我正在做的事情,也就是说,
可以选择几个具有相同界面的不同对象。如果可以,为什么我会有这个铸造问题?我的同事说这可能是我的转换器的问题,我倾向于同意她的观点,但不知道它是否正确,如果正确,h如何解决它
更新:问题似乎不在转换器内部,而是因为我传递集合
以动态收集所选值,作为
的值。我将其作为列表
传递,并将其作为对象
返回。然后我可以将其转换为对象[]
并且它里面的每个对象都通过内省被分配到相应的对象中,它是有效的。但是为什么它会改变初始对象呢?它不应该这样做。
提前感谢您,我的代码如下:
这是一个界面:
public interfaces AllObjects{
public String getName();
}
有多个对象,MyObject
,MyObject1
,MyObject2
实现上述接口:
public MyObject implements AllObjects{
...
}
这是我的bean以及我的对象是如何初始化的:
public MyBean {
Map<String, Map<String,List<AllObjects>>> objectContainer = new LinkedHashMap<String, Map<String,List<AllObjects>>>();
public void init(){
Map<String,List<AllObjects>> nameValuesPairs1 = new LinkedHashMap<String,List<AllObjects>>();
List<AllObjects> allSelectedObjects1 = new ArrayList<AllObjects>();
List<AllObjects> allDefaultObjects1 = new ArrayList<AllObjects>();
nameValuesPairs.put("default",allDefaultObjects1);
nameValuesPairs.put("selected",allSelectedObjects1);
Map<String,List<AllObjects>> nameValuesPairs2 = new LinkedHashMap<String,List<AllObjects>>();
List<AllObjects> allSelectedObjects2 = new ArrayList<AllObjects>();
List<AllObjects> allDefaultObjects2 = new ArrayList<AllObjects>();
nameValuesPairs.put("default",allDefaultObjects2);
nameValuesPairs.put("selected",allSelectedObjects2);
objectContainer.put("Object 1", nameValuesPairs1);
objectContainer.put("Object 2", nameValuesPairs2);
}
public void onObjectChange(){
...
List<AllObjects> objects= objectContainer .getControllers().get("Object 1").get("selected"); //throws exception
...
}
}
您可以为每个对象创建一个唯一的元组,元组必须转换为唯一的字符串..并且可以在数组中包含可能的值
static Map<String,Object> uniques = new LinkedHashMap<>();
static{
//you could save the possible values in a Singleton Bean
uniques.put(key,value)...
}
好的,看来
和
与我使用的数据模型不太兼容,Map
。我以以下方式更改了我的数据模型:
public ObjectContainer{
private String name;
private List<MyObject> defaultObjects;
private List<MyObject> selectedObbjects;
}
<p:selectCheckboxMenu
value="#{object.selectedObjects}" label="#{object.name}"
converter="#{myObjectConverter}"
filter="true"
filterMatchMode="startsWith"
panelStyle="width:250px">
<f:selectItems value="#{object.defaultObjects}" var="value" itemValue="#{value}" itemLabel="#{value.name}" />
<p:ajax event="change" process="@this @parent" listener="#{myBean.onObjectChange}"/>
</p:selectCheckboxMenu>
</ui:repeat>
公共对象容器{
私有字符串名称;
私有列表对象;
所选对象的私有列表;
}
并将其作为列表传递给
。因此我的*.xhtml页面的外观如下所示:
public ObjectContainer{
private String name;
private List<MyObject> defaultObjects;
private List<MyObject> selectedObbjects;
}
<p:selectCheckboxMenu
value="#{object.selectedObjects}" label="#{object.name}"
converter="#{myObjectConverter}"
filter="true"
filterMatchMode="startsWith"
panelStyle="width:250px">
<f:selectItems value="#{object.defaultObjects}" var="value" itemValue="#{value}" itemLabel="#{value.name}" />
<p:ajax event="change" process="@this @parent" listener="#{myBean.onObjectChange}"/>
</p:selectCheckboxMenu>
</ui:repeat>
现在一切都正常了。
我扔掉了我的自定义转换器并使用了SelectItemsConverter
from。强烈建议进行更改,代码变得更简单易读。抱歉,但我不明白它能帮我什么忙?我在更新中写道,它改变了存储值的集合,而不是我接收数组的列表。它应该有方法来更改您的值获取集合值..必须有一个键字符串才能传递给html,html传递键..从键中检索值.然后..必须考虑如何获取数组(是否变异)使用值或键..这是转换器的方式。您的值可以是一个类来获取可变值..类ArrayMutateContainer,属性为String getKey()返回uniqueString,集合getMutateValues()…存储ArrayMutateContainer的映射
public ObjectContainer{
private String name;
private List<MyObject> defaultObjects;
private List<MyObject> selectedObbjects;
}
<p:selectCheckboxMenu
value="#{object.selectedObjects}" label="#{object.name}"
converter="#{myObjectConverter}"
filter="true"
filterMatchMode="startsWith"
panelStyle="width:250px">
<f:selectItems value="#{object.defaultObjects}" var="value" itemValue="#{value}" itemLabel="#{value.name}" />
<p:ajax event="change" process="@this @parent" listener="#{myBean.onObjectChange}"/>
</p:selectCheckboxMenu>
</ui:repeat>