سؤال

لدي الكود التالي في صفحة JSF ، بدعم من JSF Managed Bean

<h:dataTable value="#{poolBean.pools}" var="item">
    <h:column>
        <f:facet name="header">
                <h:outputLabel value="Id"/>  
        </f:facet>
        <h:outputText value="#{item.id}"/>
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputLabel value="Start Range"/>
        </f:facet>
        <h:inputText value="#{item.startRange}" required="true"/>               
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="End Range"/>
        </f:facet>
        <h:inputText value="#{item.endRange}" required="true"/>                            
    </h:column>
    <h:column>
        <f:facet name="header">
            <h:outputText value="Pool type"/>
        </f:facet>            
        <h:selectOneMenu value="#{item.poolType}" required="true">
            <f:selectItems value="#{poolBean.poolTypesMenu}"/>
        </h:selectOneMenu>
    </h:column>
    <h:column>
        <f:facet name="header"/>
        <h:commandButton id="ModifyPool" actionListener="#{poolBean.updatePool}" image="img/update.gif" title="Modify Pool">
            <f:attribute name="pool" value="#{item}"/>
        </h:commandButton>
    </h:column>
</h:dataTable>

تم تخصيص جزء الكود هذا لتحرير مجموعة العناصر. يحتوي كل صف من الجدول على زر "تحرير" الذي يقدم قيم الصف المتغيرة للصف إلى الخادم. لديه العنصر نفسه كسممة. يتم تنفيذ إرسال عن طريق استدعاء طريقة ActionListener في Backing Managed Bean.

يعمل هذا الرمز بشكل صحيح على Glassfish V 2.1

ولكن عندما تم تحديث الخادم إلى Glassfish V 2.1.1 ، توقفت السمة لتمريرها بشكل صحيح. بدلاً من تمرير العنصر المعدل (عندما نغير القيم في صف الجدول ، نقوم بالفعل بتغيير حقول الكائنات الأساسية) ، يتم إرسال العنصر المصدر إلى الخادم ، أي العنصر الذي تم تقديمه مسبقًا إلى الصفحة. يتم التخلص من جميع التغييرات التي تم إجراؤها على الصفحة.

حاولت تحديث إصدار JSF من 1.2_02 إلى 1.2_14 (نحن نستخدم JSF RI) ، ولكن لم يكن له أي تأثير.

ربما صادف أي شخص نفس المشكلة؟ سيتم تقدير أي مساعدة واقتراحات.

هل كانت مفيدة؟

المحلول

سفن السمك الزجاجي مع JSF المجمعة. Glassfish v2.1.1 سفن مع Mojarra 1.2_13. أنت في الواقع لا تحتاج إلى الحصول على libs JSF في /WEB-INF/lib. لست متأكدًا من سبب حدوث هذه المشكلة بالذات ، ولكن يجب أن تبدأ ، تحتاج إلى التأكد من عدم وجود تصادمات إصدار JSF في ClassPath.

ومع ذلك ، فإن طريقة JSF 1.2 المفضلة لتمرير خصائص الفول تستخدم f:setPropertyActionListener.

<h:commandButton id="ModifyPool" actionListener="#{poolBean.updatePool}" image="img/update.gif" title="Modify Pool">
    <f:setPropertyActionListener target="#{poolBean.pool}" value="#{item}"/>
</h:commandButton>

تحديث: أتذكر شيئًا ؛ تشير هذه المشكلة إلى أنه لا يزال لديك إصدار JSF 1.2 أقدم من 1.2_05 في ClassPath. لقد تغير معالجة سمات المكون وفقًا لهذا الإصدار لصالح تحسينات الأداء. باختصار ، إذا كان لديك jsf-api.jar من بين 1.2_05 في classpath الخاص بك ، في حين أن هناك ملف jsf-impl.jar من 1.2_05 أو الأحدث في classpath الخاص بك ، سوف تواجه هذه المشكلة بالضبط.

الحل واضح: تنظيف ClassPath للتخلص من إصدار JSF الأقدم. المسارات التي يغطيها classpath الافتراضية الخاصة بـ WebApp تحت كل منها /WEB-INF/lib, Appserver/lib (وهو في حالة الأسماك الزجاجية في مكان ما في Appserver/domains/domainname/*) و ال JRE/lib و JRE/lib/ext. ضع في اعتبارك أن الأسماك الزجاجية javaee.jar يتضمن مكتبات JSF أيضًا ، لذلك تحتاج حقًا إلى التأكد من عدم امتلاكك للجرة (أو أي ملف جار آخر خاص بـ AppServer) في الخاص بك /WEB-INF/lib أو في مكان آخر.

نصائح أخرى

يمكنك إضافة jboss el واكتب:

#{poolBean.updatePool(item)}

لا تحتاج إلى التماس بالكامل لذلك ، يعمل بشكل جيد مع JSF RI.

ربما يتعلق الأمر بالطريقة التي ينفذ بها JSF 1.2 ActionListener. في JSF 1.1 وحتى التطبيقات الحديثة لـ JSF 1.2 (Richfaces ، Trinidad ، إلخ) ، كان الترتيب setPropertyActionListener (أو السمة) -> ActionListener -> الإجراء. في JSF 1.2 ويتم تنفيذه الآن في Richfaces و Trinidad (غير متأكد من ICEFaces) ، يكون الترتيب هو actionlistener -> setPropertyActionListener (أو السمة) -> الإجراء. أعلم أنه مزعج ومزعج للغاية ... من فكر في ذلك؟ ماذا كان في ذهنهم؟ على أي حال ، حاول استخدام إجراء بدلاً من قائمة ActionListener ومعرفة ما إذا كان يعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top