встроенный контейнер openejb не может найти сохраняемость.XML
я использую openEjb во встроенном режиме для тестирования компонента сеанса без состояния, который имеет введенный EntityManager. Однако, когда я запускаю тест, он терпит неудачу, потому что он не может инициализировать приложение. Когда я вижу консоль, я также вижу ошибку, связанную с невозможностью найти постоянство.в XML
Примечание: я попытался поместить WebContent, а также META-INF в путь к классам, но это тоже не помогает.
обновление:
там что - то очень странное в поиске ресурсов при использовании openejb + eclipse.
- я добавил WebContent в исходные папки. Я перестал получать настойчивость.ошибка xml, но теперь я получаю ошибку, которая предполагает, что openejb не смог найти управляемый ресурс
- я добавил WebContent в исходные папки, но с другой выходной папкой (используя разрешить выходные папки для исходных папок) и сохраняемость.ошибка xml снова начинается
- я скопировал META-INF в "test", который является исходной папкой для всех тестов, и все работает нормально
- Что касается пунктов 1 и 2, то проблема, похоже, заключается в том, что WEB-INF также включается в состав WebContent. Если я исключаю WEB-INF, то снова openejb может найти постоянство.xml в тесте и тест работает нормально
Я честно не знаю, что происходит.
я вставляю все соответствующие ошибки и код ниже.
ошибка стек из неудачного теста JUnit в Eclipse
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.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
}
настойчивость.в 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
}
3 ответов
я получил то же самое исключение и проблема в том, что два persistence.xml
были на пути к классам OpenEJB.
когда я удалил один из них, проблема была решена.
сообщение об исключении не полезно здесь на части OpenEJB, но если вы отлаживаете в org.apache.openejb.config.Appmodule
' s hasFailures()
или hasErrors()
метод, вы можете увидеть более полезную информацию в EjbModule.getValidation()
звонки! (Версия 4.0.0).
Maven создает структуру каталогов для веб-проектов, как показано ниже:
src->main-+->java
+->resources->META-INF
+->webapp->WEB-INF
чтобы решить вашу проблему, вы должны создать dir [META-INF] в каталоге [resources] и разместить персистентность.xml есть.
основная проблема здесь заключается в том, что при запуске junit JUnit начинает думать, что файл WAR как файл JAR, следовательно, пытается найти упорство.xml в META-INF в root, а в War-файле META-INF создается внутри папки WebContent. Я просто создал символическую ссылку в папке src, указывающую на исходный META-INF. И voilla...............он работал. :)