У меня странная проблема с пользовательским @FacesConverter
с JBoss-7.1.0.CR1b во время вызова AJAX в p:selectOneMenu
(Primefaces 3.0).
Упрощенный конвертер выглядит следующим образом:нет NPE или других исключений в этом классе
@FacesConverter("MyConverter")
public class MyConverter implements Converter
{
public Object getAsObject(FacesContext fc, UIComponent uic, String value)
{
logger.debug("getAsObject value: "+value);
if (submittedValue.trim().equals("")) {return null;}
else
{
MyEjb ejb = new MyEjb();
ejb.setId(Long.parseLong(value()));
return ejb; //**** alternative with return null; ****
}
}
public String getAsString(FacesContext fc, UIComponent uic, Object value)
{
if (value == null || value.equals("")) {return "";}
else
{
MyEjb ejb = (MyEjb)value;
return ""+ejb.getId();
}
}
}
Конвертер используется в p:selectOneMenu
:
<h:form>
<p:selectOneMenu value="#{clientBean.selected}" converter="MyConverter">
<f:selectItems value="#{clientBean.all}" var="my"
itemLabel="#{my.name}" itemValue="#{my}"/>
<p:ajax listener="#{clientBean.changed}" />
</p:selectOneMenu>
</h:form>
Это не ракетостроение, измененный метод просто делает отладку:
public void changed()
{
logger.info("changed() "+selected);
}
Но теперь раздражающая часть: changed()
никогда не вызывается с кодом, как описано выше, но я получаю вызов преобразователя три раз:
12:37:51,500 DEBUG getAsObject value: 35
12:37:51,502 DEBUG getAsObject value:
12:37:51,503 DEBUG getAsObject value:
Если я изменю p:selectOneMenu value="#{clientBean.selectedId}"
на long selectedId
и не буду использовать конвертер, метод вызывается один раз.Даже если я return null
в getAsObject()
, changed()
называется (один раз).Я не предполагаю, что это связано с Primefaces, потому что у меня такое же поведение, если я использую h:selectOneMenu
и f:ajax
.