diff options
author | Christof Rabensteiner <christof.rabensteiner@iaik.tugraz.at> | 2019-08-22 10:05:03 +0200 |
---|---|---|
committer | Christof Rabensteiner <christof.rabensteiner@iaik.tugraz.at> | 2019-08-23 15:17:14 +0200 |
commit | e6e0950a506d814415d8036e68e54d2034b6d3e7 (patch) | |
tree | 8dc0f1c57f063f639ad884a03f951ea9a9f2fb7c /src/main/java/at/gv/egiz/moazs/client | |
parent | 763724b04d25d07fce5559c1d7a6c12badab937c (diff) | |
download | moa-zs-e6e0950a506d814415d8036e68e54d2034b6d3e7.tar.gz moa-zs-e6e0950a506d814415d8036e68e54d2034b6d3e7.tar.bz2 moa-zs-e6e0950a506d814415d8036e68e54d2034b6d3e7.zip |
Fix: JAXB + Java >= 9 Class Loader Bug & Ensure Tomcat Deployment
- Problem: Jaxb + JAVA >= 9 Runtime + Tomcat = ClassNotFoundException:
ContextFactory.
Reason: Apparently, jaxb uses the "wrong" classloader (the system
classloader via the thread classloader) and this classloader does
not know about jaxb api's and implementations at runtime since
oracle decided to move jaxb* out of JRE.
Solution: create a new thread, override the thread's "thread"
classloader with the "class" classloader and do all jaxb
interactions in that thread. See:
https://sjhannah.com/blog/2018/11/21/jaxb-hell-on-jdk-9/
- Move "run jaxb interactions in own thread with class class loader"
code into own component (JaxbClassNotFoundFix,
runInTheadWithClassClassLoader) and wrap ClientFactory and
Marshaller code into the "runInTheadWithClassClassLoader".
- Ensure that app can be deployed in a Tomcat container (by following
this guide: https://www.baeldung.com/spring-boot-war-tomcat-deploy)
Diffstat (limited to 'src/main/java/at/gv/egiz/moazs/client')
-rw-r--r-- | src/main/java/at/gv/egiz/moazs/client/ClientFactory.java | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java b/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java index 94eb712..818c4c9 100644 --- a/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java +++ b/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java @@ -2,6 +2,7 @@ package at.gv.egiz.moazs.client; import at.gv.egiz.moazs.preprocess.ConfigUtil; import at.gv.egiz.moazs.util.FileUtils; +import at.gv.egiz.moazs.util.JAXBClassNotFoundFix; import at.gv.egiz.moazs.util.StoreSOAPBodyBinaryInRepositoryInterceptor; import at.gv.zustellung.app2mzs.xsd.ClientType; import at.gv.zustellung.app2mzs.xsd.KeyStoreType; @@ -25,7 +26,6 @@ import javax.xml.ws.BindingProvider; import javax.xml.ws.soap.SOAPBinding; import static at.gv.zustellung.app2mzs.xsd.KeyStoreType.keyStoreTypeBuilder; -import static java.util.stream.Collectors.toMap; @Component public class ClientFactory { @@ -54,7 +54,10 @@ public class ClientFactory { * @return the client */ public <T> T create(ClientType params, Class<T> clazz) { + return JAXBClassNotFoundFix.runInTheadWithClassClassLoader(() -> createClient(params, clazz)); + } + private <T> T createClient(ClientType params, Class<T> clazz) { var factory = new JaxWsClientFactoryBean(); factory.setServiceClass(clazz); factory.setAddress(params.getURL()); |