From 2cf864954ffee575747b9dbf5958c34d08c3f8a6 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Tue, 7 Nov 2017 20:08:10 +1300 Subject: [PATCH] #1204 - Check presence of JAXB and javax @PostConstruct (which may not be present in minimal Java 9) --- .../java/io/ebean/config/ClassLoadConfig.java | 16 ++++++++++++++++ .../ebeaninternal/dbmigration/DdlGenerator.java | 4 +++- .../server/deploy/BeanDescriptorManager.java | 2 +- .../deploy/BeanLifecycleAdapterFactory.java | 17 +++++++++++++---- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/ebean/config/ClassLoadConfig.java b/src/main/java/io/ebean/config/ClassLoadConfig.java index 617e0f952..2059b76bd 100644 --- a/src/main/java/io/ebean/config/ClassLoadConfig.java +++ b/src/main/java/io/ebean/config/ClassLoadConfig.java @@ -54,6 +54,22 @@ public class ClassLoadConfig { return isPresent("javax.validation.constraints.NotNull"); } + /** + * Return true if javax PostConstruct annotation is present (maybe not in java9). + * If not we don't support PostConstruct lifecycle events. + */ + public boolean isJavaxPostConstructPresent() { + return isPresent("javax.annotation.PostConstruct"); + } + + /** + * Return true if javax JAXB is present (maybe not in java9). + * If not we don't try to parse or support 'extra ddl'. + */ + public boolean isJavaxJAXBPresent() { + return isPresent("javax.xml.bind.JAXBException"); + } + /** * Return true if Jackson annotations like JsonIgnore are present. */ diff --git a/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java b/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java index 65826830e..e6ed35533 100644 --- a/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java +++ b/src/main/java/io/ebeaninternal/dbmigration/DdlGenerator.java @@ -36,6 +36,7 @@ public class DdlGenerator { private final boolean generateDdl; private final boolean runDdl; private final boolean createOnly; + private final boolean jaxbPresent; private CurrentModel currentModel; private String dropAllContent; @@ -43,6 +44,7 @@ public class DdlGenerator { public DdlGenerator(SpiEbeanServer server, ServerConfig serverConfig) { this.server = server; + this.jaxbPresent = serverConfig.getClassLoadConfig().isJavaxJAXBPresent(); this.generateDdl = serverConfig.isDdlGenerate(); this.createOnly = serverConfig.isDdlCreateOnly(); if (serverConfig.getTenantMode().isDynamicDataSource() && serverConfig.isDdlRun()) { @@ -139,7 +141,7 @@ public class DdlGenerator { runScript(false, createAllContent, getCreateFileName()); String ignoreExtraDdl = System.getProperty("ebean.ignoreExtraDdl"); - if (!"true".equalsIgnoreCase(ignoreExtraDdl)) { + if (!"true".equalsIgnoreCase(ignoreExtraDdl) && jaxbPresent) { String extraApply = ExtraDdlXmlReader.buildExtra(server.getDatabasePlatform().getName()); if (extraApply != null) { runScript(false, extraApply, "extra-dll"); diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java index 81df08c31..987109aea 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -227,7 +227,7 @@ public class BeanDescriptorManager implements BeanDescriptorMap { this.updateChangesOnly = serverConfig.isUpdateChangesOnly(); - this.beanLifecycleAdapterFactory = new BeanLifecycleAdapterFactory(); + this.beanLifecycleAdapterFactory = new BeanLifecycleAdapterFactory(serverConfig); this.persistControllerManager = new PersistControllerManager(bootupClasses); this.postLoadManager = new PostLoadManager(bootupClasses); this.postConstructManager = new PostConstructManager(bootupClasses); diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java b/src/main/java/io/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java index 73da1e1a3..ae6e670f0 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanLifecycleAdapterFactory.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.deploy; import io.ebean.annotation.PostSoftDelete; import io.ebean.annotation.PreSoftDelete; +import io.ebean.config.ServerConfig; import io.ebean.event.BeanPersistAdapter; import io.ebean.event.BeanPersistRequest; import io.ebean.event.BeanPostConstructListener; @@ -31,6 +32,12 @@ import java.util.List; */ class BeanLifecycleAdapterFactory { + private final boolean postConstructPresent; + + BeanLifecycleAdapterFactory(ServerConfig serverConfig) { + this.postConstructPresent = serverConfig.getClassLoadConfig().isJavaxPostConstructPresent(); + } + /** * Register a BeanPersistController for methods annotated with lifecycle events. */ @@ -41,7 +48,7 @@ class BeanLifecycleAdapterFactory { // look for annotated methods MethodsHolder methodHolder = new MethodsHolder(); for (Method m : methods) { - methodHolder.checkMethod(m); + methodHolder.checkMethod(m, postConstructPresent); } if (methodHolder.hasPersistMethods()) { @@ -86,7 +93,7 @@ class BeanLifecycleAdapterFactory { /** * Check the method for all the annotations we are interested in. */ - private void checkMethod(Method method) { + private void checkMethod(Method method, boolean postConstructPresent) { if (method.isAnnotationPresent(PrePersist.class)) { preInserts.add(method); hasPersistMethods = true; @@ -125,8 +132,10 @@ class BeanLifecycleAdapterFactory { if (method.isAnnotationPresent(PostLoad.class)) { postLoads.add(method); } - if (method.isAnnotationPresent(PostConstruct.class)) { - postConstructs.add(method); + if (postConstructPresent) { + if (method.isAnnotationPresent(PostConstruct.class)) { + postConstructs.add(method); + } } } }