2015-08-28 7 views
6

मैं CDI नीचे कामयाब सेम है है:UnserializableDependencyException: वेल्ड-001,413: सेम एक passivating गुंजाइश वाणी लेकिन एक गैर passivation सक्षम निर्भरता

@Named 
@SessionScoped 
public class InfoPageController implements Serializable { 

    @Inject 
    private InfoPageMapper mapper; 

} 

यह तैनाती 4.1 ग्लासफिश के दौरान नीचे अपवाद फेंकता है:

Exception while loading the app : CDI deployment failure:WELD-001413: The bean Managed Bean [class de.triaconsulting.cashyourgame.fe.controller.InfoPageController] with qualifiers [@Default @Any @Named] declares a passivating scope but has a non-passivation-capable dependency Managed Bean [class de.triaconsulting.cashyourgame.fe.mapper.InfoPageMapper] with qualifiers [@Any @Default] 
org.jboss.weld.exceptions.UnserializableDependencyException: WELD-001413: The bean Managed Bean [class de.triaconsulting.cashyourgame.fe.controller.InfoPageController] with qualifiers [@Default @Any @Named] declares a passivating scope but has a non-passivation-capable dependency Managed Bean [class de.triaconsulting.cashyourgame.fe.mapper.InfoPageMapper] with qualifiers [@Any @Default] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPointPassivationCapable(Validator.java:477) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:395) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:291) 
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:134) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:165) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:529) 
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:515) 
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:490) 
    at org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:419) 
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:90) 
    at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:225) 
    at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131) 
    at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:496) 
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219) 
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:539) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:535) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:356) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:534) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:565) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:557) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:356) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:556) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1464) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:109) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1846) 
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1722) 
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534) 
    at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224) 
    at org.glassfish.grizzly.http.server.StaticHttpHandlerBase.service(StaticHttpHandlerBase.java:189) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 
    at java.lang.Thread.run(Thread.java:745) 

यह कैसे होता है और मैं इसे कैसे हल कर सकता हूं?

+1

संदेश 'InfoPageMapper' का उल्लेख करता है लेकिन मुझे आपकी पोस्ट में कोई परिभाषा नहीं दिखाई दे रही है -' InfoPageController' में संदर्भ को छोड़कर। संदेश थोड़ा सा छीन लिया गया: 'बीन प्रबंधित बीन [... InfoPageController] ... एक निष्क्रिय गुंजाइश घोषित करता है लेकिन एक गैर-निष्क्रियता-सक्षम निर्भरता प्रबंधित बीन है [... InfoPageMapper] ' – Thomas

+1

मुझे विश्वास है कि इसका मतलब यह नहीं है कि इसका मतलब है सभी इंजेक्शन बीन्स/सत्र स्कोप्ड बीन के गुण Serializable हैं। और ऐसा लगता है कि InfoPageMapper पर उंगली को इंगित कर रहा है। – Gimby

उत्तर

10

समाधान पहले, एक विवरण के द्वारा पीछा किया:

@Named 
@SessionScoped 
public class InfoPageController implements Serializable { 

    @Inject 
    transient private InfoPageMapper mapper; 

और अब स्पष्टीकरण:

त्रुटि

सरलतम आप कर सकते हैं InfoPageController रूप transient में क्षेत्र InfoPageMapper mapper निशान है संदेश इसे पढ़ने योग्य भाषा में बताता है:

बीन इन्फोपेज कंट्रोलर, जो सत्रस्कोप्ड है, क्रमिक होना चाहिए, लेकिन इसके लिए InfoPageMapper की आवश्यकता है, जो धारावाहिक और न ही क्षणिक है - यह निर्धारित करना संभव नहीं है कि को InfoPageController को क्रमबद्ध कैसे करें।

CDI में, कुछ स्कोप (अक्सर SessionScope) जो सेम Serializable होने की आवश्यकता नहीं है - ज्यादातर क्योंकि वे किसी भी तरह HTTP सत्र, जो और अधिक वस्तुओं है कि स्मृति में और समय-समय पर फिट हो सकते हैं से जुड़े हैं सर्वर को डिस्क पर उन्हें स्वैप करने की आवश्यकता हो सकती है।

ऐसा लगता है कि आपको यह मिला क्योंकि InfoPageController Serializable लागू करता है। लेकिन यह जावा धारावाहिक सिद्धांतों के अनुसार पर्याप्त नहीं है। आप सुनिश्चित करें कि आपके Serializable वर्ग के सभी सदस्य क्षेत्रों में से एक है की जरूरत है: - आदिम प्रकार (पूर्णांक, बूलियन) - एक वस्तु है कि serializable है (सभी क्रमबद्धता नियम रिकर्सिवली लागू) - क्षेत्र कीवर्ड क्षणिक के साथ चिह्नित है (जो जैसे ही निजी कीवर्ड)

सीडीआई के साथ चाल यह है कि आप सभी इंजेक्शन वाले क्षेत्रों को क्षणिक के रूप में चिह्नित कर सकते हैं, क्योंकि ऑब्जेक्ट डिस्क से स्मृति में deserialized है जब वे फिर से इंजेक्शन दिया जाता है। इसलिए आप क्षणिक वस्तु को नहीं हटाएंगे जो अन्यथा निराशाजनक होने पर शून्य हो जाएगा, क्योंकि यह पहले डिस्क पर संग्रहीत नहीं था।

एक और समाधान इंजेक्शन बीन InfoPageMapper serializable भी बनाना है।लेकिन फिर समस्या InfoPageMapper में इंजेक्शन वाले फ़ील्ड के साथ पुनरावर्ती रूप से दोहराई जा सकती है। क्षणिक कीवर्ड आपकी समस्या को हल करता है जहां यह होता है और अन्य बना को धारावाहिक होने के लिए मजबूर नहीं करता है अगर उन्हें होने की आवश्यकता नहीं है।

+0

फ़ील्ड क्षणिक को चिह्नित करने से पहले मैं दोबारा जांच कर दूंगा कि फ़ील्ड सत्र बीन से संबंधित है या नहीं। यदि InfoPageMapper डिफ़ॉल्ट दायरे (@ पर निर्भर) के साथ एक बीन है, तो आप निश्चित रूप से इसे सत्र स्कोप्ड बीन बनाते हैं। तो यह प्रत्येक सत्र में डुप्लिकेट किया गया है। यदि मैपर में अधिक नियंत्रक भूमिका है, तो संभवतः आप प्रत्येक सत्र में सत्र स्कोप्ड तत्व को इंजेक्ट करते हैं, सही डेटा पुनर्प्राप्त किया जाएगा। – Kazaag

+0

@ कज़ाग - आप सही हैं, कुछ मामलों में सत्रित बीन को सत्र स्कोप्ड के रूप में समझना समझ में आता है। तकनीकी दृष्टि से, यह एक सीरियलज़ेबल बीन भी होगा, इसलिए यह अपवाद के साथ समस्या का समाधान करेगा। तार्किक दृष्टिकोण से, एप्लिकेशन अलग-अलग व्यवहार कर सकता है, क्योंकि कई सेम एक सत्र के दायरे में एक ही बीन साझा करेंगे। – OndrejM

+0

शायद थोड़ी सी सलाह: मेरे परीक्षण मामलों के लिए मैं बीन्स में "एनोटेटेड" से "सब" से डिस्कवरी मोड सेट करना भी भूल गया। एक्सएमएल << संस्करण = "2.0" बीन-डिस्कवरी-मोड = "सब" >>। – Bluefire

0

अपने सर्वर त्रुटि संदेश से, de.triaconsulting.cashyourgame.fe.mapper.InfoPageMapper देखें। क्या InfoPageMapper Serializable लागू करता है या नहीं?

आप InfoPageController ऑब्जेक्ट के सत्र स्कोप में InfoPageMapper ऑब्जेक्ट इंजेक्ट करते हैं। सत्र स्कोप ऑब्जेक्ट्स और इसके सदस्य को क्रमबद्ध करने की आवश्यकता है। तो InfoPageMapper ऑब्जेक्ट को क्रमबद्ध करने में सक्षम होना चाहिए।

तो InfoPageMapper Serializable इंटरफ़ेस को कार्यान्वित किया जाना चाहिए।

यदि आप InfoPageController में InfoPageMapper ऑब्जेक्ट को क्रमबद्ध नहीं करना चाहते हैं, तो आप इस चर पर क्षणिक कीवर्ड सेट कर सकते हैं।

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