WebServiceTemplate (dept44-starter-webservicetemplate)

WebServiceTemplate (dept44-starter-webservicetemplate)

Denna starter skapar en WebServiceTemplate med HttpClient som underliggande klient för att göra SOAP-anrop.

Lägg till följande i tjänstens pom.xml

<dependency> <groupId>se.sundsvall.dept44</groupId> <artifactId>dept44-starter-webservicetemplate</artifactId> </dependency>

 

Modulen tillhandahåller en WebServiceTemplateBuilder för att sätta upp en WebServiceTemplate:

WebServiceTemplate webServiceTemplate = new WebServiceTemplateBuilder() .withBaseUrl(http://example.com:8080) [1] .withPackageToScan("se.sundsvall.client") [2] .withPackagesToScan(List.of("se.sundsvall.client2", "se.sundsvall.client3")) [3] .withClientInterceptor(new CustomSoapClientInterceptor()) [4] .withReadTimeout(Duration.ofMillis(10000L)) [5] .withConnectTimeout(Duration.ofMillis(5000L))) [6] .withLogbook(logbook) [7] .withKeyStoreFileLocation("classpath:keystore.p12") [8] .withKeyStorePassword("password-for-keystore") [9] .withBasicAuthentication("username", "password") [10] .build(); [11]

 

[1] Anger bas-URL för klienten som skapas.
[2] Vilket paket som skall scannas efter JAXB2-annoteringar. Kan användas flera gånger samt i kombination med [3] .
[3] Anger flera paket som skall scannas efter JAXB2-annoteringar.
[4] Anger om specifika interceptorer skall användas. Går att använda flera gånger för att lägga till fler än en inerceptor.
[5] Anger read timeout. Default-värde är 60 sekunder.
[7] Sätter upp request- och response-loggning.
[8] Anger en keystore i form av t.ex. en classpath ("classpath:keystore.p12"), måste användas i kombination med [9].
[9] Lösenord för keystore
[10] Om angiven (användarnamn och lösenord) sätts Basic-autentisering upp.
[11] Skapar upp klienten

Användning

SomeObject response = (SomeObject) webServiceTemplate.marshalSendAndReceive(someRequest);

 

Vanliga problem

Viktigt att tänka på är att de klasser som scannas har annoteringen @XmlRootElement, annars kommer tjänsten förmodligen slänga ur sig någonting i stil med:
Unable to marshal type "SomeObject" as an element because it is missing an @XmlRootElement annotation

För att råda bot på det kan man göra på följande vis när klient-klasserna genereras, det som skapar @XmlRootElement-taggarna är bindings-filen:

<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> <!-- Fluent builder dependency for generated classes --> <dependencies> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-fluent-api</artifactId> <version>3.0</version> </dependency> </dependencies> <executions> <execution> <id>xjc</id> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <xjbSources> <xjbSource>${basedir}/src/main/resources/xjb/bindings.xjb</xjbSource> </xjbSources> <!-- Enable fluent --> <arguments> <argument>-Xfluent-api</argument> </arguments> <outputDirectory>${generated-sources-folder}</outputDirectory> <sourceType>wsdl</sourceType> <sources> <source>${basedir}/src/main/resources/contracts.wsdl</source> </sources> </configuration> </plugin>

 

bindings.xjb

<!-- Bindings file to add @XmlRootElement to generated classes. --> <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0" xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc"> <jaxb:globalBindings> <xjc:simple/> </jaxb:globalBindings> </jaxb:bindings>

Todo

  • Stöd för oauth2