我对ap:selectOneMenu有问题,无论我做什么,我都无法让JSF调用JPA实体上的setter。JSF验证失败,并显示以下消息:
形式:位置:验证错误:值无效
我正在同一类型的其他几个类上工作(例如,联接表类),但是我一生都无法工作。
如果有人可以针对此类问题提出一些故障排除/调试提示,将不胜感激。
使用日志语句,我已经验证了以下内容:
- 该
Conveter
是回到正确的,非null
数值。 - 我的JPA实体中没有Bean验证。
- 该设置器
setLocation(Location location)
从不被调用。
这是我能做的最简单的例子,它根本不起作用:
<h:body>
<h:form id="form">
<p:messages id="messages" autoUpdate="true" />
<p:selectOneMenu id="location" value="#{locationStockList.selected.location}" converter="locationConverter">
<p:ajax event="change" update=":form:lblLocation"/>
<f:selectItems value="#{locationStockList.locationSelection}"/>
</p:selectOneMenu>
</h:form>
</h:body>
转换器:
@FacesConverter(forClass=Location.class, value="locationConverter")
public class LocationConverter implements Converter, Serializable {
private static final Logger logger = Logger.getLogger(LocationConverter.class.getName());
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value.isEmpty())
return null;
try {
Long id = Long.parseLong(value);
Location location = ((LocationManagedBean) context.getApplication().getELResolver().getValue(context.getELContext(), null, "location")).find(id);
logger.log(Level.SEVERE, "Converted {0} to {1}" , new Object[] {value, location});
return location;
} catch (NumberFormatException e) {
return new Location();
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null || value.toString().isEmpty() || !(value instanceof Location))
return "";
return String.valueOf(((Location) value).getId());
}
}
控制台输出:
// Getter method
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0]
// Session Bean
INFO: Finding ejb.locations.Location with id=3
// Session Bean
INFO: ### Returning : ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3]
// Converter
SEVERE: Converted 3 to ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3]
// Getter method -> Where did my selected Location go ??
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0]
equals
检查在mojarra代码中的确切位置。我的情况有点复杂。我创建了自己的自定义组件,该组件允许用户进行复杂的无线电布局。如果我只有一个无线电组(在我的自定义组件下面的f:selectItems),它会很好地工作。但是,随着布局变得更加复杂(多个无线电组,每个无线电组都有自己的f:selectItems,但是都共享相同的选择),我必须在ui:repeat中包含f:selectItems,然后ui:repeat才在我的自定义组件下。然后,我遇到了这个问题。我希望看到处理这个钻嘴鱼科码