diff options
Diffstat (limited to 'src/main/java/at')
5 files changed, 83 insertions, 7 deletions
diff --git a/src/main/java/at/gv/egiz/moazs/MoaZS.java b/src/main/java/at/gv/egiz/moazs/MoaZS.java index 3009745..e4e4acc 100644 --- a/src/main/java/at/gv/egiz/moazs/MoaZS.java +++ b/src/main/java/at/gv/egiz/moazs/MoaZS.java @@ -3,9 +3,19 @@ package at.gv.egiz.moazs; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +import java.net.URL; +import java.net.URLClassLoader; @SpringBootApplication -public class MoaZS { +public class MoaZS extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(MoaZS.class); + } public static void main(String[] args) { SpringApplication.run(MoaZS.class, args); diff --git a/src/main/java/at/gv/egiz/moazs/backend/DeliveryRequestBackend.java b/src/main/java/at/gv/egiz/moazs/backend/DeliveryRequestBackend.java index 72f8ba0..46b0c2c 100644 --- a/src/main/java/at/gv/egiz/moazs/backend/DeliveryRequestBackend.java +++ b/src/main/java/at/gv/egiz/moazs/backend/DeliveryRequestBackend.java @@ -11,7 +11,8 @@ import at.gv.zustellung.app2mzs.xsd.DeliveryRequestType; import at.gv.zustellung.msg.xsd.App2ZusePort; import at.gv.zustellung.msg.xsd.DeliveryRequestStatusType; import at.gv.zustellung.tnvz.xsd.TNVZServicePort; -import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @@ -28,7 +29,7 @@ import static java.lang.String.format; @Profile("!cluster") public class DeliveryRequestBackend implements Consumer<String> { - private static final Logger log = Logger.getLogger(DeliveryRequestBackend.class); + private static final Logger log = LoggerFactory.getLogger(DeliveryRequestBackend.class); private static final String MZS_PIPELINE_ERROR_MSG = "An error occured while processing the DeliveryRequest with AppDeliveryID=%s. "; private static final String DELIVERY_REQUEST_MISSING_ERROR_MSG = 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()); diff --git a/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java b/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java index 1a86079..bf502c0 100644 --- a/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java +++ b/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java @@ -9,6 +9,8 @@ import java.io.InputStream; import java.io.StringWriter; import java.util.HashMap; +import static at.gv.egiz.moazs.util.JAXBClassNotFoundFix.runInTheadWithClassClassLoader; + /** * @author xerx593 * Source: https://stackoverflow.com/questions/44676532/how-to-use-spring-to-marshal-and-unmarshal-xml @@ -32,17 +34,22 @@ public class Marshaller { } public <T> String marshallXml(final T obj) { + if (obj == null) { return "null"; } StringWriter sw = new StringWriter(); Result result = new StreamResult(sw); - jaxbMarshaller.marshal(obj, result); - return sw.toString(); + + return runInTheadWithClassClassLoader(() -> { + jaxbMarshaller.marshal(obj, result); + return sw.toString(); + }); } public <T> T unmarshallXml(final InputStream xml) { - return (T) jaxbMarshaller.unmarshal(new StreamSource(xml)); + return runInTheadWithClassClassLoader( + () -> (T) jaxbMarshaller.unmarshal(new StreamSource(xml))); } } diff --git a/src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java b/src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java new file mode 100644 index 0000000..9e72286 --- /dev/null +++ b/src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java @@ -0,0 +1,55 @@ +package at.gv.egiz.moazs.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.function.Supplier; + +import static at.gv.egiz.moazs.MoaZSException.moaZSException; + +@Component +public class JAXBClassNotFoundFix { + + private static final Logger log = LoggerFactory.getLogger(JAXBClassNotFoundFix.class); + + /** + * Solves JAXB's "ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory" in Java >= 9 + * by running func in a dedicated thread which has its context classloader replaced with a classloader that finds + * the ContextFactory. + * + * See https://sjhannah.com/blog/2018/11/21/jaxb-hell-on-jdk-9/ + * Note: "runInTheadWithClassClassLoader" is not a typo. + * @param func function that is called in a dedicated thread. + * @param <A> return value of func. + * @return + */ + public static <A> A runInTheadWithClassClassLoader(Supplier<A> func) { + + final Object[] result = new Object[1]; + final Exception[] error = new Exception[1]; + + Thread t = new Thread(() -> { + try { + result[0] = func.get(); + } catch (Exception ex) { + error[0] = ex; + } + }); + + t.setContextClassLoader(JAXBClassNotFoundFix.class.getClassLoader()); + t.start(); + + try { + t.join(); + } catch (InterruptedException ex) { + log.error("Interrupted. ", ex); + } + + if (error[0] != null) { + throw moaZSException("Could not run function.", error[0]); + } + + return (A)result[0]; + } +} |