2012-04-17 10 views
6

नहीं ढूंढ सकता है मैं एक स्टेटलेस सत्र बीन का परीक्षण करने के लिए एम्बेडेड मोड में openEjb का उपयोग कर रहा हूं, जिसमें इंजेक्शन मैनेजर इंजेक्शन है। हालांकि, जब मैं परीक्षण चलाता हूं, तो यह विफल रहता है क्योंकि यह एप्लिकेशन को प्रारंभ नहीं कर सका। जब मैं कंसोल देखता हूं तो मैं persistence.xmlopenejb एम्बेडेड कंटेनर persistence.xml

नोट: मैंने वेबकंटेंट, साथ ही साथ क्लासपाथ में मेटा-आईएनएफ डालने की कोशिश की, लेकिन इससे कोई मदद नहीं मिलती है।

अद्यतन:

वहाँ संसाधन लुकअप जब openejb + ग्रहण का उपयोग कर के बारे में बहुत ही अजीब बात है।

  1. मैंने स्रोत फ़ोल्डरों में वेबकंटेंट जोड़ा। मैंने persistence.xml त्रुटि प्राप्त करना बंद कर दिया, लेकिन अब मुझे एक त्रुटि मिलती है जो बताती है कि openejb को कोई प्रबंधित संसाधन नहीं मिला
  2. मैंने स्रोत फ़ोल्डर्स में वेबकंटेंट जोड़ा, लेकिन एक अलग आउटपुट फ़ोल्डर (स्रोत फ़ोल्डर के लिए आउटपुट फ़ोल्डर्स को अनुमति देने के साथ) , और persistence.xml त्रुटि फिर से उत्पन्न शुरू होता है
  3. ठीक
  4. 1, और 2 अंक के बारे में, तेह मुद्दा रहा है
  5. मैं 'परीक्षण' है, जो सभी परीक्षणों के लिए स्रोत फ़ोल्डर है, और सब कुछ में META-INF की नकल की रन तथ्य यह है कि WEB-INF को वेबकंटेंट के हिस्से के रूप में भी शामिल किया जाता है। अगर मैं बाहर निकालने के वेब INF, उसके बाद फिर से परीक्षा में persistence.xml पा सकते हैं openejb और परीक्षण ठीक

समाप्त होने पर मुझे क्या हो रहा है के बारे में ईमानदारी से अनजान हूँ।

मैं नीचे सभी प्रासंगिक त्रुटियों और कोड चिपका रहा हूं।

त्रुटि ग्रहण में ढेर नाकाम रहने JUnit परीक्षण से

org.apache.openejb.OpenEjbContainer$InvalidApplicationException: org.apache.openejb.config.ValidationFailedException: Module failed validation. AppModule(name=) 
    at org.apache.openejb.OpenEjbContainer$Provider.createEJBContainer(OpenEjbContainer.java:273) 
    at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:56) 
    at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:43) 
    at com.diycomputerscience.slides.service.SlideServiceTest.setUp(SlideServiceTest.java:45) 
    at junit.framework.TestCase.runBare(TestCase.java:128) 
    at junit.framework.TestResult$1.protect(TestResult.java:106) 
    at junit.framework.TestResult.runProtected(TestResult.java:124) 
    at junit.framework.TestResult.run(TestResult.java:109) 
    at junit.framework.TestCase.run(TestCase.java:120) 
    at junit.framework.TestSuite.runTest(TestSuite.java:230) 
    at junit.framework.TestSuite.run(TestSuite.java:225) 
    at junit.framework.TestSuite.runTest(TestSuite.java:230) 
    at junit.framework.TestSuite.run(TestSuite.java:225) 
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.apache.openejb.config.ValidationFailedException: Module failed validation. AppModule(name=) 
    at org.apache.openejb.config.ReportValidationResults.deploy(ReportValidationResults.java:82) 
    at org.apache.openejb.config.AppInfoBuilder.build(AppInfoBuilder.java:264) 
    at org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:696) 
    at org.apache.openejb.OpenEjbContainer$Provider.createEJBContainer(OpenEjbContainer.java:267) 
    ... 18 more 

मेरे कंसोल आउटपुट:

Apache OpenEJB 4.0.0-beta-2 build: 20120115-08:26 
http://openejb.apache.org/ 
INFO - openejb.home = /home/user/workspace/wwald/slides 
INFO - openejb.base = /home/user/workspace/wwald/slides 
INFO - Using 'javax.ejb.embeddable.EJBContainer=true' 
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) 
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) 
INFO - Inspecting classpath for applications: 38 urls. Consider adjusting your exclude/include. Current settings: openejb.deployments.classpath.exclude='', openejb.deployments.classpath.include='.*' 
INFO - Found EjbModule in classpath: /home/user/workspace/wwald/slides/build/classes 
INFO - Searched 38 classpath urls in 2000 milliseconds. Average 52 milliseconds per url. 
INFO - Beginning load: /home/user/workspace/wwald/slides/build/classes 
INFO - Configuring enterprise application: /home/user/workspace/wwald/slides 
INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container) 
INFO - Auto-creating a container for bean SlideService: Container(type=STATELESS, id=Default Stateless Container) 
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) 
INFO - Auto-creating a container for bean com.diycomputerscience.slides.service.SlideServiceTest: Container(type=MANAGED, id=Default Managed Container) 
INFO - Dumping Generated ejb-jar.xml to: /tmp/ejb-jar-5804778531295096416slides.xml 
INFO - Dumping Generated openejb-jar.xml to: /tmp/openejb-jar-2921830618491817127slides.xml 
ERROR - FAIL ... SlideService: Missing required persistence.xml for @PersistenceContext ref "em" to unit "entities" 
ERROR - Invalid EjbModule(name=slides, path=/home/user/workspace/wwald/slides/build/classes) 
INFO - Set the 'openejb.validation.output.level' system property to VERBOSE for increased validation details. 
WARN - configureApplication.loadFailed 

स्टेटलेस सत्र बीन:

@Stateless 
public class SlideService { 
    @PersistenceContext(unitName="entities", type=PersistenceContextType.TRANSACTION) 
    private EntityManager em; 

    //various business methods not shown for brevity 
} 

persistence.xml

<persistence version="1.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="entities"> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
     <jta-data-source>myds</jta-data-source> 
     <non-jta-data-source>myds</non-jta-data-source> 
     <properties> 
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

JUnit परीक्षण का मामला:

public class SlideServiceTest extends TestCase { 

    private SlideService slideService; 

    public SlideServiceTest(String name) { 
     super(name); 
    } 

    protected void setUp() throws Exception { 
     super.setUp(); 

     final Properties p = new Properties(); 
     p.put("myds", "new://Resource?type=DataSource"); 
     p.put("myds.JdbcDriver", "org.hsqldb.jdbcDriver"); 
     p.put("myds.JdbcUrl", "jdbc:hsqldb:mem:slidedb"); 

     EJBContainer ejbContainer = EJBContainer.createEJBContainer(); 
     Object oSlideService = ejbContainer.getContext().lookup("java:global/slides/SlideService"); 
     assertNotNull(oSlideService); 
     this.slideService = (SlideService)oSlideService; 
    } 

    //not showing test methods for brevity, since the code fails in setUp itself 
} 

उत्तर

7

मैं एक ही अपवाद प्राप्त किया और समस्या यह है कि दो persistence.xml OpenEJB की classpath पर थे।

जब मैंने उनमें से एक को हटा दिया, तो समस्या हल हो गई।

अपवाद संदेश OpenEJB की ओर से यहाँ उपयोगी नहीं है, लेकिन अगर आप org.apache.openejb.config.Appmodule के hasFailures() या hasErrors() विधि में डिबग, आप EjbModule.getValidation() कॉल में अधिक उपयोगी जानकारी देख सकते हैं! (संस्करण 4.0.0)।

1

मुख्य समस्या यह है कि जूनिट चलाने के दौरान, जुनीट WAR फ़ाइल को जेएआर फ़ाइल के रूप में सोचने लगता है, इसलिए रूट पर मेटा-आईएनएफ में persistance.xml को खोजने की कोशिश करता है, जबकि WAR फ़ाइल में मेटा-आईएनएफ अंदर बनाया जाता है वेबकंटेंट फ़ोल्डर। मैंने बस मूल मेटा-आईएनएफ को इंगित करने वाले src फ़ोल्डर में एक प्रतीकात्मक लिंक बनाया है। और voilla ............... यह काम किया।

src->main-+->java 
      +->resources->META-INF 
      +->webapp->WEB-INF 

आपकी समस्या का समाधान करने के लिए आप और वहाँ जगह persistence.xml dir [META-INF] निर्देशिका के अंतर्गत [संसाधन] बनाना चाहिए: :)

2

Maven जिन्हें आप नीचे देख वेब परियोजनाओं के लिए निर्देशिका संरचना बनाता है।

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