[英]Primefaces selectOneMenu converter called but not working
I've looked at the other questions this and this , etc, the problem is that my convert gets called but the values of selectOneMenu doesn't change . 我查看了this和this等其他问题, 问题是调用了convert,但是selectOneMenu的值没有改变 。 My entity class is generated, and has equals as well as hashCode and I would like not to change anything in it - if it gets regenerated then all changes will be lost (The work around is to change toString of the entity class).
我的实体类已生成,并且具有等于hashCode的值,并且我想不对其进行任何更改-如果重新生成它,则所有更改都将丢失(解决方法是更改实体类的toString)。
The XHTML code snipped: XHTML代码片段:
<p:selectOneMenu id="defid"
value="#{abcController.selected.defid}"
converter="defConverter">
The Converter: 转换器:
@FacesConverter("defConverter")
public class DefConverter implements Converter
{
private static final Logger LOG = Logger.getLogger(DefConverter.class.getName());
@EJB
private DefFacade defFacade;
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String string)
{
LOG.info("getAsObject: " + string);
try
{
return defFacade.findWithNFieldsWithValue("name", string, "=").get(0);
}
catch (Exception ex)
{
LOG.log(Level.SEVERE, "Error while fetching Def for " + string, ex);
}
return null;
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object obj)
{
LOG.info("getAsString obj class: " + obj.getClass().getName());
if(obj instanceof Def)
{
Def def = (Def)obj;
LOG.info("getAsString def name: " + def.getName());
return def.getName();
}
else
{
StringBuilder sbError = new StringBuilder("The object of class ");
sbError.append(obj.getClass().getName()).append(" is not of Def");
throw new ClassCastException(sbError.toString());
}
}
}
The entity class snipped (this is generated): 实体类被截断(生成):
...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "defid")
private Long defid;
...
@Override
public int hashCode()
{
int hash = 0;
hash += (defid != null ? defid.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 Def))
{
return false;
}
Def other = (Def) object;
if ((this.defid == null && other.defid != null) || (this.defid != null && !this.defid.equals(other.defid)))
{
return false;
}
return true;
}
When the page loads, I can see the log statements as follow: 页面加载后,我可以看到以下日志语句:
getAsString obj class: com.xyz.Def
getAsString def name: Name 1
getAsString obj class: com.xyz.Def
getAsString def name: Name 2
getAsString obj class: com.xyz.Def
getAsString def name: Name 3
Thus the converter gets called and returns the correct values but on the page it is still com.xyz.Def[ defid=1 ] (Drop down and normal) 因此,转换器将被调用并返回正确的值,但在页面上仍为com.xyz.Def [defid = 1] (向下下拉并正常显示)
The converter seems to be working, but you didn't post the whole <p:selectOneMenu>
code, in particular <f:selectItems>
. 该转换器似乎正在运行,但是您没有发布整个
<p:selectOneMenu>
代码,尤其是<f:selectItems>
。 It should look something like this 它应该看起来像这样
<p:selectOneMenu id="defid"
value="#{abcController.selected.defid}"
converter="defConverter">
<f:selectItems value="#{abcController.defs}" var="def"
itemLabel="#{def.name}" itemValue="#{def.defId}" />
</p:selectOneMenu>
itemLabel
is responsible for printing displayed values. itemLabel
负责打印显示的值。
Try the following code 试试下面的代码
<p:selectOneMenu id="defid" value="#{abcController.selected.def}"
converter="defConverter">
<f:selectItems value="#{abcController.defs}" var="def"
itemValue="#{def}" itemLabel="#{def.name}" />
</p:selectOneMenu>
Converter is used to convert between a complex Java object and a String representation. Converter用于在复杂的Java对象和String表示形式之间进行转换。 For this you need to specify the whole def object as item value instead.
为此,您需要将整个def对象指定为item值。 You should also ensure that #{abcController.selected.def} refers to a def property, not some Long property representing the def ID.
您还应确保#{abcController.selected.def}引用的是def属性,而不是某些表示def ID的Long属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.