ADF移动应用程序上的奇怪ClassCastException

时间:2014-01-02 22:55:40

标签: oracle-adf-mobile

我使用JDev 11.1.2.4 我有一个自定义的Supplier类,它通过调用applicationScope bean方法加载一些项目。 我试图将我的对象转换为适当的selectItems。我本可以获得正确的对象列表,但突然遇到ClassCastException。不幸的是,我在互联网上找不到任何解决方案。 我知道这些课程完全相同。 (另外我在调试时看到包和classeses没有区别) 问题出在哪儿??我在互联网上阅读了一些关于不同类加载器的内容,但我无法达到根本原因或解决方案。 请帮我 brgds

   package com.accmee.mobile.supplier;

    import com.accmee.mobile.pojo.ServiceCategory;
    import com.acme.structure.util.datalist.SimpleListSupplier;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    import javax.el.MethodExpression;
    import oracle.adfmf.framework.api.AdfmfJavaUtilities;
    import oracle.adfmf.javax.faces.model.SelectItem;

    public class ServiceCategorySupplier extends SimpleListSupplier
    {
        public ServiceCategorySupplier(boolean blankItemApplied)
        {
            super(blankItemApplied);
        }

        public ServiceCategorySupplier()
        {
            super();
        }

        public void loadList()
        {
            try
            {
                MethodExpression me = AdfmfJavaUtilities.getMethodExpression("#{applicationScope.loginBean.loadCategories}", List.class, new Class[] { }); /* this applicationScope bean method loads through webservice consume via JavaAPI, and works properly returns list with elements**/
                List categories = (List)me.invoke(AdfmfJavaUtilities.getAdfELContext(), new Object[] { });
                itemList.addAll(getConvertedToSelectItemList(categories, true)); // here passes parameter into method which faced exception
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }

        public String getListName()
        {
            return "categories";
        }

        public static Collection getConvertedToSelectItemList(List list, boolean blankItemApplied)
        {
            Collection convertedCollection = new ArrayList();
            SelectItem selectItem = null;

            if (blankItemApplied)
            {
                selectItem = new SelectItem();
                convertedCollection.add(selectItem);
            }
            for(int i=0;i<list.size();i++)
            {
                ServiceCategory superEntity  = (ServiceCategory)list.get(i); // here is the ClassCastException, this line throws exception
                selectItem = getConvertedToSelectItem(superEntity);
                convertedCollection.add(selectItem);
            }
            return convertedCollection;
        }


        public static SelectItem getConvertedToSelectItem(ServiceCategory superEntity)
        {
            SelectItem selectItem = new SelectItem();
            selectItem.setLabel(superEntity.getName());
            selectItem.setValue(superEntity);
            return selectItem;
        }
    }

2 个答案:

答案 0 :(得分:0)

由两个不同的类加载器加载的同一个类在运行时被视为两个不同的类。可能这就是发生在你身上的事情。

观看此页面:http://www.ibm.com/developerworks/java/library/j-dyn0429/

答案 1 :(得分:0)

我不得不改变方法。因此,我将返回类型的加载类别方法更改为通用类型而不是我的自定义类。 然后就像那样工作。

public class ServiceCategorySupplier extends SimpleListSupplier
{
    public ServiceCategorySupplier(boolean blankItemApplied)
    {
        super(blankItemApplied);
    }


    public ServiceCategorySupplier()
    {
        super();
    }


    public void loadList()
    {
        try
        {
            MethodExpression me = AdfmfJavaUtilities.getMethodExpression("#{applicationScope.loginBean.loadCategories}", List.class, new Class[] { });
            List categories = (List)me.invoke(AdfmfJavaUtilities.getAdfELContext(), new Object[] { });
            list.addAll(categories);
            loadItemList();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            throw new AdfException(e.getMessage(), AdfException.ERROR);
        }
    }


    public void loadItemList()
    {
        SelectItem selectItem = null;

        itemList=new SelectItem[list.size()];
        ServiceCategory serviceCategory=null;
        for(int i=0;i<list.size();i++)
        {
            GenericType serviceCategoryType  = (GenericType)list.get(i);
            serviceCategory = (ServiceCategory)GenericTypeBeanSerializationHelper.fromGenericType(ServiceCategory.class, serviceCategoryType);
            selectItem = getConvertedToSelectItem(serviceCategory);
            itemList[i]=selectItem;
        }
    }


    public static SelectItem getConvertedToSelectItem(ServiceCategory superEntity)
    {
        SelectItem selectItem = new SelectItem();


        selectItem.setLabel(superEntity.getName());
        selectItem.setValue(superEntity.getId());


        return selectItem;
    }


    public String getListName()
    {
        return "categories";
    }
}