/ / प्राइमफेस पिकलिस्ट लेबल अपडेट के बाद खाली हैं - जावा, जेएसएफ, प्राइमफेस

अद्यतन के बाद प्राइमफेस पिकलिस्ट लेबल खाली हैं - जावा, जेएसएफ, प्राइमफेस

पिकलिस्ट के साथ फॉर्म:

<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" />

जब मैं नंबर इनपुट नहीं भरता तो कमांड बटन पर क्लिक करें - सत्यापन संदेश दिखाया गया है, लेकिन पिकलिस्ट अपडेट में ऑब्जेक्ट के लेबल और वे केवल खाली ब्रैकेट हैं।

itemLabel="#{integration.name} (#{integration.backend.name})"

जब मैं उनका चयन करता हूं और नाम भरता हूं - सब कुछ ठीक है (काम करता है जैसे कि मैंने पहली जगह में नाम भर दिया है), इसलिए केवल समस्या लेबल हैं। यह मेरा कन्वर्टर है:

@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();
}

}

और सेम पर विधि एकीकरण प्राप्त करने के लिए (बीन scoped है देखें):

public DualListModel<Integration> getIntegrations() {
integrations.setSource(customerService.getIntegrations(customer));
return integrations;
}

क्या कारण है कि लेबल खाली हैं?

उत्तर:

जवाब के लिए 0 № 1

आपके कन्वर्टर में आप केवल अपने पूजो के आईडी वैल्यू को पास कर रहे हैं, इसलिए जब यह परिवर्तित हो जाता है तो मूल रूप से एक सुलझे हुए आईडी के साथ एक अशक्त वस्तु है।

नीचे दिए गए अपने कनवर्टर को बदलने से सबसे अधिक संभावना होगी कि पहला लेबल ठीक से दिखाया गया है:

 /**
* {@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();
}

हालाँकि, यदि आपकी कक्षा एक स्थायी इकाई है, तो आप अपने कनवर्टर में डेटाबेस से ऑब्जेक्ट को पुनः प्राप्त करना चाह सकते हैं, निम्नलिखित कोड की जाँच करें:

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;
}

मैं मान रहा हूं कि आप हाइबरनेट और स्प्रिंग का उपयोग कर रहे हैं, और आपके आवेदन के संदर्भ में सेशनफैक्टरी सेम को परिभाषित किया गया है।