Author: rmannibucau
Date: Tue Jun 5 07:00:02 2018
New Revision: 1832912
URL: http://svn.apache.org/viewvc?rev=1832912&view=rev
Log:
MEECROWAVE-116 Fixes and Closes #10, thanks Yann Blazart for this PR which
ensures JPA exceptions are not lost
Added:
openwebbeans/meecrowave/trunk/meecrowave-jpa/src/test/java/org/apache/meecrowave/jpa/internal/exceptionlost/
openwebbeans/meecrowave/trunk/meecrowave-jpa/src/test/java/org/apache/meecrowave/jpa/internal/exceptionlost/JPAExceptionLostTest.java
Modified:
openwebbeans/meecrowave/trunk/meecrowave-jpa/src/main/java/org/apache/meecrowave/jpa/internal/EntityManagerContext.java
Modified:
openwebbeans/meecrowave/trunk/meecrowave-jpa/src/main/java/org/apache/meecrowave/jpa/internal/EntityManagerContext.java
URL:
http://svn.apache.org/viewvc/openwebbeans/meecrowave/trunk/meecrowave-jpa/src/main/java/org/apache/meecrowave/jpa/internal/EntityManagerContext.java?rev=1832912&r1=1832911&r2=1832912&view=diff
==============================================================================
---
openwebbeans/meecrowave/trunk/meecrowave-jpa/src/main/java/org/apache/meecrowave/jpa/internal/EntityManagerContext.java
(original)
+++
openwebbeans/meecrowave/trunk/meecrowave-jpa/src/main/java/org/apache/meecrowave/jpa/internal/EntityManagerContext.java
Tue Jun 5 07:00:02 2018
@@ -127,7 +127,10 @@ public class EntityManagerContext implem
}
private <T> void doDestroy(final Contextual<T> contextual, final
BeanInstanceBag<T> bag) {
- contextual.destroy(bag.beanInstance, bag.beanCreationalContext);
+ if ( bag.beanInstance !=null ) {
+ // check null here because in case of missconfiguration, this
can raise an NPE and hide the original exception
+ contextual.destroy(bag.beanInstance,
bag.beanCreationalContext);
+ }
bag.beanCreationalContext.release();
}
Added:
openwebbeans/meecrowave/trunk/meecrowave-jpa/src/test/java/org/apache/meecrowave/jpa/internal/exceptionlost/JPAExceptionLostTest.java
URL:
http://svn.apache.org/viewvc/openwebbeans/meecrowave/trunk/meecrowave-jpa/src/test/java/org/apache/meecrowave/jpa/internal/exceptionlost/JPAExceptionLostTest.java?rev=1832912&view=auto
==============================================================================
---
openwebbeans/meecrowave/trunk/meecrowave-jpa/src/test/java/org/apache/meecrowave/jpa/internal/exceptionlost/JPAExceptionLostTest.java
(added)
+++
openwebbeans/meecrowave/trunk/meecrowave-jpa/src/test/java/org/apache/meecrowave/jpa/internal/exceptionlost/JPAExceptionLostTest.java
Tue Jun 5 07:00:02 2018
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.meecrowave.jpa.internal.exceptionlost;
+
+import org.apache.commons.dbcp2.BasicDataSource;
+import org.apache.meecrowave.Meecrowave;
+import org.apache.meecrowave.jpa.api.Jpa;
+import org.apache.meecrowave.jpa.api.PersistenceUnitInfoBuilder;
+import org.apache.meecrowave.jpa.api.Unit;
+import org.apache.meecrowave.junit.MeecrowaveRule;
+import org.apache.openjpa.persistence.ArgumentException;
+import org.h2.Driver;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.persistence.Entity;
+import javax.persistence.EntityManager;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.sql.DataSource;
+
+public class JPAExceptionLostTest {
+
+ @Rule
+ public final TestRule rule = new MeecrowaveRule(
+ new Meecrowave.Builder()
+ .randomHttpPort()
+ .includePackages(this.getClass().getPackage().getName()),
"")
+ .inject(this);
+
+
+ @Inject
+ private BadService badService;
+
+ @Test
+ public void test_originalExceptionNotOverriden() {
+ try {
+ badService.save(new BadUser("test"));
+ Assert.fail("should fail");
+ } catch (Throwable throwable) {
+ Assert.assertTrue("Original Exception has been lost",throwable
instanceof ArgumentException);
+ Assert.assertTrue(throwable.getMessage().contains("Unenhanced
classes must have a public or protected no-args constructor."));
+ }
+
+ }
+
+ public static class BadService {
+
+ @Inject
+ @Unit(name = "test")
+ private EntityManager em;
+
+ @Jpa(transactional = true)
+ public BadUser save(final BadUser user) {
+ em.persist(user);
+ return user;
+ }
+
+ @Jpa(transactional = false) // no tx
+ public BadUser find(final long id) {
+ return em.find(BadUser.class, id);
+ }
+
+ }
+
+ @ApplicationScoped
+ public static class JpaConfig {
+ @Produces
+ public PersistenceUnitInfoBuilder unit(final DataSource ds) {
+ return new PersistenceUnitInfoBuilder()
+ .setUnitName("test")
+ .setDataSource(ds)
+ .setExcludeUnlistedClasses(true)
+ .addManagedClazz(BadUser.class)
+ .addProperty("openjpa.RuntimeUnenhancedClasses",
"supported")
+ .addProperty("openjpa.jdbc.SynchronizeMappings",
"buildSchema");
+ }
+
+ @Produces
+ @ApplicationScoped
+ public DataSource dataSource() {
+ final BasicDataSource source = new BasicDataSource();
+ source.setDriver(new Driver());
+ source.setUrl("jdbc:h2:mem:jpaextensiontest");
+ return source;
+ }
+ }
+
+ @Entity
+ @Dependent
+ public static class BadUser {
+ @Id
+ @GeneratedValue
+ private long id;
+
+ private String name;
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public BadUser(String name) {
+ this.name = name;
+ }
+ }
+
+}
+