mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
refactor: unwrap invocationTargetException (#1718)
This commit is contained in:
committed by
Rob Bygrave
parent
dcd81a857d
commit
cf4d45befb
@@ -145,6 +145,20 @@ class BeanLifecycleAdapterFactory {
|
||||
return methodList.toArray(new Method[methodList.size()]);
|
||||
}
|
||||
|
||||
static RuntimeException unwrapException(ReflectiveOperationException e) {
|
||||
if (e instanceof InvocationTargetException) {
|
||||
Throwable targetException = ((InvocationTargetException)e).getTargetException();
|
||||
if (targetException instanceof RuntimeException) {
|
||||
// return unchecked exceptions
|
||||
return (RuntimeException) targetException;
|
||||
} else {
|
||||
// wrap checked exceptions
|
||||
return new PersistenceException("Error invoking lifecycle method", targetException);
|
||||
}
|
||||
}
|
||||
return new PersistenceException("Error invoking lifecycle method", e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds Methods for the lifecycle events.s
|
||||
*/
|
||||
@@ -192,7 +206,7 @@ class BeanLifecycleAdapterFactory {
|
||||
try {
|
||||
method.invoke(bean);
|
||||
} catch (InvocationTargetException | IllegalAccessException e) {
|
||||
throw new PersistenceException("Error invoking lifecycle method", e);
|
||||
throw unwrapException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,7 +282,7 @@ class BeanLifecycleAdapterFactory {
|
||||
try {
|
||||
method.invoke(bean);
|
||||
} catch (InvocationTargetException | IllegalAccessException e) {
|
||||
throw new PersistenceException("Error invoking lifecycle method", e);
|
||||
throw unwrapException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -301,7 +315,7 @@ class BeanLifecycleAdapterFactory {
|
||||
try {
|
||||
method.invoke(bean);
|
||||
} catch (InvocationTargetException | IllegalAccessException e) {
|
||||
throw new PersistenceException("Error invoking lifecycle method", e);
|
||||
throw unwrapException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
package org.tests.lifecycle;
|
||||
|
||||
import io.ebean.BaseTestCase;
|
||||
import io.ebean.DB;
|
||||
import org.tests.model.basic.EBasicWithLifecycleExceptions;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
public class TestLifecycleExceptions extends BaseTestCase {
|
||||
|
||||
@Test
|
||||
public void prePersist_unchecked() {
|
||||
EBasicWithLifecycleExceptions bean = new EBasicWithLifecycleExceptions();
|
||||
bean.preException = new IndexOutOfBoundsException();
|
||||
assertThatThrownBy(() -> DB.save(bean)).isInstanceOf(IndexOutOfBoundsException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void prepersist_checked() {
|
||||
EBasicWithLifecycleExceptions bean = new EBasicWithLifecycleExceptions();
|
||||
bean.preException = new IOException();
|
||||
assertThatThrownBy(() -> DB.save(bean))
|
||||
.isInstanceOf(PersistenceException.class)
|
||||
.hasCauseInstanceOf(IOException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void postPersist_unchecked() {
|
||||
EBasicWithLifecycleExceptions bean = new EBasicWithLifecycleExceptions();
|
||||
bean.postException = new IndexOutOfBoundsException();
|
||||
assertThatThrownBy(() -> DB.save(bean)).isInstanceOf(IndexOutOfBoundsException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void postpersist_checked() {
|
||||
EBasicWithLifecycleExceptions bean = new EBasicWithLifecycleExceptions();
|
||||
bean.postException = new IOException();
|
||||
assertThatThrownBy(() -> DB.save(bean))
|
||||
.isInstanceOf(PersistenceException.class)
|
||||
.hasCauseInstanceOf(IOException.class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
package org.tests.model.basic;
|
||||
|
||||
import io.ebean.annotation.PostSoftDelete;
|
||||
import io.ebean.annotation.PreSoftDelete;
|
||||
import io.ebean.annotation.SoftDelete;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.PostLoad;
|
||||
import javax.persistence.PostPersist;
|
||||
import javax.persistence.PostRemove;
|
||||
import javax.persistence.PostUpdate;
|
||||
import javax.persistence.PrePersist;
|
||||
import javax.persistence.PreRemove;
|
||||
import javax.persistence.PreUpdate;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.Version;
|
||||
|
||||
@Entity
|
||||
@Table(name = "e_basic_with_ex")
|
||||
public class EBasicWithLifecycleExceptions {
|
||||
|
||||
@Id
|
||||
Long id;
|
||||
|
||||
@SoftDelete
|
||||
boolean deleted;
|
||||
|
||||
@Version
|
||||
Long version;
|
||||
|
||||
public transient Throwable preException;
|
||||
public transient Throwable postException;
|
||||
|
||||
@PrePersist
|
||||
public void prePersist() throws Throwable {
|
||||
if (preException != null) {
|
||||
throw preException;
|
||||
}
|
||||
}
|
||||
|
||||
@PostPersist
|
||||
public void postPersist() throws Throwable {
|
||||
if (postException != null) {
|
||||
throw postException;
|
||||
}
|
||||
}
|
||||
|
||||
@PreUpdate
|
||||
public void preUpdate() throws Throwable {
|
||||
if (preException != null) {
|
||||
throw preException;
|
||||
}
|
||||
}
|
||||
|
||||
@PostUpdate
|
||||
public void postUpdate() throws Throwable {
|
||||
if (postException != null) {
|
||||
throw postException;
|
||||
}
|
||||
}
|
||||
|
||||
@PreRemove
|
||||
public void preRemove() throws Throwable {
|
||||
if (preException != null) {
|
||||
throw preException;
|
||||
}
|
||||
}
|
||||
|
||||
@PostRemove
|
||||
public void postRemove() throws Throwable {
|
||||
if (postException != null) {
|
||||
throw postException;
|
||||
}
|
||||
}
|
||||
|
||||
@PreSoftDelete
|
||||
public void preSoftDelete() throws Throwable {
|
||||
if (preException != null) {
|
||||
throw preException;
|
||||
}
|
||||
}
|
||||
|
||||
@PostSoftDelete
|
||||
public void postSoftDelete() throws Throwable {
|
||||
if (postException != null) {
|
||||
throw postException;
|
||||
}
|
||||
}
|
||||
|
||||
@PostLoad
|
||||
public void postLoad1() throws Throwable {
|
||||
if (postException != null) {
|
||||
throw postException;
|
||||
}
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void postConstruct1() throws Throwable {
|
||||
if (postException != null) {
|
||||
throw postException;
|
||||
}
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public boolean isDeleted() {
|
||||
return deleted;
|
||||
}
|
||||
|
||||
public void setDeleted(boolean deleted) {
|
||||
this.deleted = deleted;
|
||||
}
|
||||
|
||||
public Long getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(Long version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user