Formulario con lista de selección:
<p:inputText id="number" value="#{accountNumberBean.account.accountNumber}" required="true" label="#{msg["newAccountNumberForm.number"]}">
<f:validateLength maximum="50" for="name" />
</p:inputText>
<p:message for="number" display="text" />
<p:pickList id="integrations" value="#{accountNumberBean.integrations}" var="integration" itemLabel="#{integration.name} (#{integration.backend.name})" itemValue="#{integration}" converter="integrationConverter">
<f:facet name="sourceCaption">#{msg["newAccountNumberForm.integrations.available"]}/>
<f:facet name="targetCaption">#{msg["newAccountNumberForm.integrations.used"]}/>
</p:pickList>
<p:commandButton value="#{msg["button.createAndNext"]}" action="#{accountNumberBean.addNewAndStay}" update="@form" />
Cuando no llene la entrada del número, haga clic en el botón de comando: se muestra el mensaje de validación, pero las etiquetas de los objetos en la lista de selección se actualizan y solo aparecen entre corchetes vacíos.
itemLabel="#{integration.name} (#{integration.backend.name})"
Cuando los selecciono y relleno el nombre, todo está bien (funciona como si hubiera rellenado el nombre en primer lugar), por lo que el único problema son las etiquetas. Este es mi convertidor:
@FacesConverter(forClass = Integration.class, value = "integrationConverter")
public class IntegrationConverter implements Converter {
/**
* {@inheritDoc}
*/
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Integration integration = new Integration();
integration.setId(Long.parseLong(value));
return integration;
}
/**
* {@inheritDoc}
*/
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return ((Integration) value).getId().toString();
}
}
Y el método en el bean para obtener integraciones (bean es vista con ámbito):
public DualListModel<Integration> getIntegrations() {
integrations.setSource(customerService.getIntegrations(customer));
return integrations;
}
¿Qué está causando que las etiquetas estén vacías?
Respuestas
0 para la respuesta № 1En su convertidor, solo está pasando el valor de id de su pojo, de modo que cuando se convierte, es básicamente un objeto nulo con un id establecido.
Si cambia su convertidor a abajo, lo más probable es que la primera etiqueta se muestre correctamente:
/**
* {@inheritDoc}
*/
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Integration integration = new Integration();
String[] split = value.split("_");
integration.setId(split[0]);
integration.setName(split[1]);
return integration;
}
/**
* {@inheritDoc}
*/
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Integration i = (Integration) value;
return i.getId() + "_" + i.getName();
}
Sin embargo, si su clase es una entidad persistente, es posible que desee recuperar el objeto de la base de datos en su convertidor, verifique el siguiente código:
private SessionFactory sessionFactory;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Object object = null;
if (StringUtils.isNotBlank(value)) {
try {
int underscoreIndex = value.indexOf("_");
String className = value.substring(0, underscoreIndex);
String id = value.substring(underscoreIndex + 1, value.length());
Class<?> clazz = Class.forName(className);
object = getSessionFactory().getCurrentSession().get(clazz, Long.parseLong(id));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return object;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
String result = null;
if (value != null && !value.equals("")) {
Integration obj = (Integration) value;
result = Hibernate.getClass(obj).getName() + "_" + obj.getId();
}
return result;
}
private SessionFactory getSessionFactory() {
if(sessionFactory == null) {
sessionFactory = ((SessionFactory) FacesContextUtils .getWebApplicationContext(FacesContext.getCurrentInstance())
.getBean("sessionFactory"));
}
return sessionFactory;
}
Supongo que está utilizando hibernate y spring, y el bean sessionFactory está definido en el contexto de su aplicación.