2011-09-01 13 views
9

में देखा गया ईजेबी दृश्य कास्टिंग करते हैं तो मैं जेबॉस एएस 7.1.0 पर एएआरएस तैनात कर रहा हूं। अल्फा 1-स्नैपशॉट (पोस्ट 7.0.1. अंतिम संस्करण)। दोनों ठीक तैनात हैं। ,क्लासकास्ट एक्सेप्शन जब एएस 7

@Startup 
@Singleton 
// one of @Local(Store.class), @Remote(Store.class), @LocalBean 
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
@Transactional(TransactionPropagation.SUPPORTS) 
public class StoreFront implements Store { 
... 


public interface Store { 
... 

जब यह तैनात यह कहता है EJB के लिए बाध्य है:

मैं कान में से एक के भीतर एक EJB सिंगलटन वर्ग एक जार के अंदर पैक किया है, अब तक

"java:app/store-core-2011.1.2-SNAPSHOT/StoreFront" 
"java:app/store-core-2011.1.2-SNAPSHOT/StoreFront!uk.co.magus.jam.store.core.Store" 
"java:module/StoreFront" 
"java:module/StoreFront!uk.co.magus.jam.store.core.Store" 
"java:global/store-ear-2011.1.2-SNAPSHOT/store-core-2011.1.2-SNAPSHOT/StoreFront!uk.co.magus.jam.store.core.Store" 
"java:global/store-ear-2011.1.2-SNAPSHOT/store-core-2011.1.2-SNAPSHOT/StoreFront" 

, बहुत अच्छा। जब मैं अन्य गैर-सीडीआई, गैर-ईजेबी कक्षा से जेएनडीआई के माध्यम से अन्य तैनात ईएआर के भीतर जेएआरआई के माध्यम से इसे देखने की कोशिश करता हूं, तो यह केवल 'वैश्विक' के तहत जेएनडीआई नामों पर पाया जा सकता है - उम्मीद है।

हालांकि

, जब मैं वास्तविक इंटरफ़ेस वर्ग के परिणामस्वरूप वस्तु कास्ट करने के लिए प्रयास करें:

Object lookupObject = new InitialContext().lookup(jndiName); 
Store store = (StoreFront)lookupObject; 

मैं निम्न अपवाद प्राप्त करें:

11:17:52,402 ERROR [jam.core.link.LinkListener] (Thread-45) Exception when casting to Store after lookup with [java:global/store-ear-2011.1.2-SNAPSHOT/store-core-2011.1.2-SNAPSHOT/StoreFront]: java.lang.ClassCastException: jam.store.core.Store$$$view1 cannot be cast to jam.store.core.Store 
    at jam.core.link.LinkListener.getStore(LinkListener.java:108) [core-jar-2011.1.2-SNAPSHOT.jar:] 
    at jam.core.link.LinkListener.postLoad(LinkListener.java:27) [core-jar-2011.1.2-SNAPSHOT.jar:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_07] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_07] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_07] 
    at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_07] 
    at org.hibernate.ejb.event.ListenerCallback.invoke(ListenerCallback.java:48) 
    at org.hibernate.ejb.event.EntityCallbackHandler.callback(EntityCallbackHandler.java:96) 
    at org.hibernate.ejb.event.EntityCallbackHandler.postLoad(EntityCallbackHandler.java:89) 
    at org.hibernate.ejb.event.EJB3PostLoadEventListener.onPostLoad(EJB3PostLoadEventListener.java:49) 
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:264) 
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1012) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:889) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2058) 
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:81) 
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3686) 
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:446) 
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:427) 
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204) 
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251) 
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148) 
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:947) 
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:863) 
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:856) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:787) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:762) 
    at org.jboss.as.jpa.container.AbstractEntityManager.find(AbstractEntityManager.java:220) [jboss-as-jpa-7.1.0.Alpha1-SNAPSHOT.jar:7.1.0.Alpha1-SNAPSHOT] 
    at jam.core.dao.GenericDAO.findById(GenericDAO.java:87) [core-jar-2011.1.2-SNAPSHOT.jar:] 
    at harvest.service.HarvesterDAOUtil.loadLink(HarvesterDAOUtil.java:251) [harvest-sar-2011.1.2-SNAPSHOT.jar:] 
    at harvest.service.1779224926$Proxy$_$$_WeldSubclass.loadLink(1779224926$Proxy$_$$_WeldSubclass.java) [harvest-sar-2011.1.2-SNAPSHOT.jar:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_07] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_07] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_07] 
    at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_07] 
    at org.jboss.interceptor.proxy.SimpleInterceptionChain.invokeNextInterceptor(SimpleInterceptionChain.java:112) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3] 
    at org.jboss.interceptor.proxy.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:119) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3] 
    at org.jboss.seam.transaction.TransactionInterceptor$1.work(TransactionInterceptor.java:194) [seam-persistence-3.0.0.Final.jar:] 
    at org.jboss.seam.transaction.Work.workInTransaction(Work.java:54) [seam-persistence-3.0.0.Final.jar:] 
    at org.jboss.seam.transaction.TransactionInterceptor.aroundInvoke(TransactionInterceptor.java:188) [seam-persistence-3.0.0.Final.jar:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_07] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_07] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_07] 
    at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_07] 
    at org.jboss.interceptor.proxy.InterceptorInvocation$InterceptorMethodInvocation.invoke(InterceptorInvocation.java:72) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3] 
    at org.jboss.interceptor.proxy.SimpleInterceptionChain.invokeNextInterceptor(SimpleInterceptionChain.java:82) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3] 
    at org.jboss.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:133) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3] 
    at org.jboss.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:112) [jboss-interceptor-core-2.0.0.Alpha3.jar:2.0.0.Alpha3] 
    at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:65) [weld-core-1.1.2.Final.jar:2011-07-26 15:02] 
    at harvest.service.1779224926$Proxy$_$$_WeldSubclass.loadLink(1779224926$Proxy$_$$_WeldSubclass.java) [harvest-sar-2011.1.2-SNAPSHOT.jar:] 
    at harvest.service.CombineHarvester.workOnLinkId(CombineHarvester.java:259) [harvest-sar-2011.1.2-SNAPSHOT.jar:] 
    at harvest.service.CombineHarvester.harvestCache(CombineHarvester.java:223) [harvest-sar-2011.1.2-SNAPSHOT.jar:] 
    at harvest.service.CombineHarvester.performHarvest(CombineHarvester.java:136) [harvest-sar-2011.1.2-SNAPSHOT.jar:] 
    at harvest.service.CombineHarvester.run(CombineHarvester.java:107) [harvest-sar-2011.1.2-SNAPSHOT.jar:] 
    at java.lang.Thread.run(Thread.java:619) [:1.6.0_07] 

EJB में से किसी से एक के साथ टिप्पणी की जाती है चाहे

@Local(Store.class) 
@Remote(Store.class) 
@LocalBean 

कोई फर्क नहीं पड़ता। जैसा कि मैं इसे समझता हूं, तथ्य यह है कि यह प्रॉक्सी 'व्यू' वापस कर रहा है सामान्य है। हालांकि, क्या मैं उस दृश्य को इंटरफेस में नहीं डाल सकता? मैं जिस ग्लोबल जेएनडीआई नाम का उपयोग करता हूं उसका संयोजन करता हूं और क्या मैं स्टोर या स्टोरफ्रंट पर डाला जाता हूं, यह भी कोई फर्क नहीं पड़ता है - जो भी संयोजन को कास्ट करने में असमर्थ है, भले ही अपवाद jam.store.core.Store$$$view1 cannot be cast to jam.store.core.Store जैसा मिलान (आधार) वर्ग नाम

क्या कोई यह बता सकता है कि मैं क्या गलत कर रहा हूं?

उत्तर

8

यह AS7 में एक बग है: https://issues.jboss.org/browse/AS7-1658

एक संभावित समाधान, लौटे वस्तु कास्ट करने के लिए नहीं है, और फिर reflection के माध्यम से तरीकों आग के लिए इसका इस्तेमाल होता है। हालांकि अच्छी तरह से घबराहट।

4

एक बेहतर दृष्टिकोण एक jboss मॉड्यूल में साझा इंटरफेस तैनाती और

   <archive> 
        <manifestEntries> 
         <Dependencies>${jboss.nonjee.modules}</Dependencies> 
        </manifestEntries> 
       </archive> 
+0

आह है, तो मुझे लगता है कि नहीं पता था। वर्तमान में हमारे लिए एक विकल्प नहीं है, लेकिन एक महान बिंदु है। –

3

इसके अलावा मैं इस टिप्पणी के साथ मदद मिल के साथ दोनों कलाकृतियों 'classpath में कि मॉड्यूल में शामिल हैं (जब Maven का उपयोग) करने के लिए है;):

डेविड लॉयड ने एक टिप्पणी - 07/मार्च/12 4:02 अपराह्न ऐसा इसलिए है क्योंकि आप स्थानीय इंटरफेस का उपयोग कर रहे हैं। स्थानीय इंटरफेस का उपयोग करते समय, आपके पास केवल इंटरफ़ेस क्लास की एक प्रति हो सकती है (यही वह स्थानीय है)। रिमोट इंटरफेस का उपयोग करने के लिए स्विच करें (या, डुप्लिकेट करने के बजाए अपने स्थानीय इंटरफेस प्राप्त करने के लिए क्लास-पथ का उपयोग करें) और समस्या गायब होनी चाहिए।

2

मुझे एक ही समस्या हो रही थी; इंटरफ़ेस क्लास को एक अलग मॉड्यूल के रूप में रखने का प्रयास किया और इसे एक कान में शामिल किया और इसे अन्य कान में प्रदान किए गए के रूप में शामिल किया; जेबीओएसएस में प्रत्येक ईएआर में कक्षाओं को एक अलग वर्ग लोडर द्वारा लोड किया जाता है। तो यदि एक ईएआर में कक्षा ए है, और दूसरे के पास कक्षा ए है, तो आपको क्लास कास्ट अपवाद मिलता है। तो दूसरे ईएआर में निर्भरता प्रदान की गई है और जेबॉस-परिनियोजन-struct.xml में मॉड्यूल निर्भरता के रूप में पहला ईएआर जोड़ें।ध्यान दें कि गतिशील मॉड्यूल निर्भरता निरंतर होने के लिए ईएआर फ़ाइल नाम की गारंटी दे सकती है; आप का निर्माण टैग के तहत <finalName> निर्दिष्ट कर सकते हैं EAR फ़ाइल को ठीक करने के लिए इस

इसके अलावा दूरदराज के स्थानीय से देखने बदल गया है - नीचे देखें, और दोनों मॉड्यूल में इंटरफेस युक्त Maven मॉड्यूल शामिल

//jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 

TO 
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.naming.remote.client.InitialContextFactory"); 

जावा के लिए एप्लिकेशन:: और आप जावा से देखने को बदलने के लिए चाहते हो जाएगा वैश्विक

final javax.naming.Context context = new InitialContext(jndiProperties); 
     AsyncFutureItf test =(AsyncFutureItf)context.lookup 
       //("java:app/Executor/AsyncFutureTest!pacakge.AsyncFutureItf"); 
       ("java:global/ExecutorEar/Executor/AsyncFutureTest!package.AsyncFutureItf"); 

और चूंकि कान आम तौर पर इस

की तरह संस्करण के साथ पंजीकृत है
java:global/ExecutorEar-<version>/Executor/AsyncFutureTest!package.AsyncFutureItf 

और आप अपने कोड में संस्करण संचालित लुकअप नहीं चाहते हैं, तो आपको दो और चीजें करने की आवश्यकता है। आपके कान में अपने application.xml में बिल्डर Maven dir (src \ मुख्य \ संसाधन \ application.xml) आप

<?xml version="1.0" encoding="UTF-8"?> 
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5"> 
    <description>Task Controller EAR</description> 
    <display-name>TaskControllerEAR</display-name> 
    <application-name>TaskControllerEAR</application-name> 
    <module> 
    <ejb>TaskController.jar</ejb> 
    </module> 
    <library-directory>lib</library-directory> 
</application> 

की तरह है और अपने पोम में "एप्लिकेशन-नाम" टैग को जोड़ने के लिए पोम उत्पन्न करने के लिए की जरूरत है आप

<groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-ear-plugin</artifactId> 
      <version>2.4.2</version> 
      <configuration> 
       <version>5</version> 
       <defaultLibBundleDir>lib</defaultLibBundleDir> 
       <earSourceDirectory>src/main/resources</earSourceDirectory> 
       <applicationXml>${project.basedir}/src/main/resources/application.xml</applicationXml> 

तरह application.xml के लिए एक संदर्भ प्रदान करने के लिए ... की जरूरत

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
     <ear-subdeployments-isolated>false</ear-subdeployments-isolated> 


     <sub-deployment name="MROControllerRest.war"> 
       <exclusions> 
          <module name="org.apache.commons.logging" /> 
          <module name="org.slf4j" /> 
          <module name="org.slf4j.ext" /> 
          <module name="org.slf4j.jcl-over-slf4j" /> 
          <module name="org.slf4j.impl" /> 
          <module name="org.apache.log4j" /> 
       </exclusions> 
       <dependencies> 
        <module name="org.slf4j" slot="1.7.5" /> 
        <module name="logger" /> 
        <module name="deployment.TaskControllerEAR.ear.TaskController.jar" export="TRUE"/> 

       </dependencies> 

यहाँ संदर्भ के लिए स्टैक ट्रेस है

java.lang.ClassCastException: com.package.TaskSplitterItf$$$view210 cannot be cast to com.package.TaskSplitterItf 
+0

वेब मॉड्यूल की पोम फ़ाइल में 'प्रदान' करने के लिए ejb मॉड्यूल के निर्भरता दायरे को बदलना क्लास कास्ट अपवाद समस्या हल करता है। धन्यवाद। – EmeraldTablet

1

एक ही मुद्दा भी अपने EJB-ग्राहक एक कान और एक अन्य "सेवा" -EAR में EJB कार्यान्वयन में है, और आप पर एक @Remote इंटरफ़ेस विधि आह्वान करता है, तो ईजेबी एक प्राचीन प्रकार के बजाय एक जटिल वस्तु लौट रहा है। वापस आने वाले जटिल वस्तु को इंटरफ़ेस के रूप में भी घोषित किया जाता है, जिसे उचित रूप से घोषित, ज्ञात, और ईजेबी-क्लाइंट के लिए उपलब्ध है। लौटा ऑब्जेक्ट कार्यान्वयन, यह "सेवा" - ईएआर में लक्षित ईजेबी कार्यान्वयन के साथ भी है। ऐसे अनुरूप कोड के बावजूद, जेबॉस क्लास कास्ट अपवाद पर विफल रहता है।

मैंने नोट किया कि आप वास्तव में सभी लक्षित ईजेबी विधियों को घोषित करने के लिए @ रिमोट इंटरफेस रख सकते हैं, लेकिन केवल उन विधियों द्वारा लौटाए गए सभी ऑब्जेक्ट्स के लिए एक सादे वर्ग घोषणा का उपयोग कर सकते हैं। यदि आप लौटे ऑब्जेक्ट्स को इंटरफेस के रूप में घोषित करते हैं, तो क्लास कास्ट अपवाद जेबॉस में आते हैं।

यह जेबॉस में एक सीमा (या बग) है; यह ग्लासफ़िश और वेबलॉगिक में काम करता है जहां हमारे पास एक बार चलने वाला कोड था।

1

वही समस्या तब हुई जब आपके पास अपने ईएआरबी में एक बार के रूप में आपके ईजेबी के साथ जार फ़ाइल है।

नमूना:

आप

  • एक myEJB.jar फ़ाइल में आपका EJB के सभी
  • एक myWebApp.war जो अपने वेब कक्षाओं में शामिल होता है/संसाधनों
  • एक myEnterprise.ear है जिसमें myEJB.jar और myWebApp.jar

यदि आपका myWebApp है।युद्ध में myEJB.jar भी स्वयं है, तो आपको यह त्रुटि होगी (क्लासकास्टएक्ससी)। लगता है कि eJB ऑब्जेक्ट myEnterprise.ear के myEJB.jar के अंदर बनाया गया है। और यदि आप इस ऑब्जेक्ट को myWJApp.jar के अंदर myEJB.jar के उसी वर्ग में डाले जाएंगे तो यह काम नहीं करेगा क्योंकि यह वर्ग किसी अन्य जार में परिभाषित किया गया है।

आपको यह त्रुटि आप अपने युद्ध फ़ाइल से myEJB.jar निकालना होगा और ClassCastExc चला गया है ...

संबंधित मुद्दे