1.1.34.12. fejezet, SOAP kliens

Kapcsolódó hivatkozások

Osztályok generálása WSDL-ből

Kommunikációs osztályok generálására használjuk a jaxws-maven-plugin bővítményt a pom.xml-ben:

<plugins>
...
			<plugin>
				<groupId>com.sun.xml.ws</groupId>
				<artifactId>jaxws-maven-plugin</artifactId>
				<version>3.0.0</version>
				<executions>
					<execution>
						<goals>
							<goal>wsimport</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<packageName>hu.infokristaly.forrasuploadsoapclient.wsdl</packageName>
					<wsdlUrls>
						<wsdlUrl>http://localhost:8080/ws/FileUploadServiceWsdl.wsdl</wsdlUrl>  <!-- Saját WSDL forrás -->
					</wsdlUrls>
					<sourceDestDir>${sourcesDir}</sourceDestDir>
					<destDir>${classesDir}</destDir>
					<extension>true</extension>
				</configuration>
			</plugin>
...
<plugins>

FileUploadClient

A SOAP hívás a következőként történik:

package hu.infokristaly.forrasuploadsoapclient;
 
import jakarta.activation.DataHandler;
import jakarta.activation.FileDataSource;
 
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
 
import hu.infokristaly.forrasuploadsoapclient.wsdl.UploadRequest;
import hu.infokristaly.forrasuploadsoapclient.wsdl.UploadResponse;
 
import java.io.File;
 
public class FileUploadClient extends WebServiceGatewaySupport {
 
	public UploadResponse uploadFile(String fileName) {
 
		UploadRequest request = new UploadRequest();
 
		File ufile = new File(fileName);
		request.setFileName(ufile.getName());
 
		FileDataSource ds = new FileDataSource(ufile);
		DataHandler dh = new DataHandler(ds);
		request.setContent(dh);
 
        return (UploadResponse) getWebServiceTemplate()
                .marshalSendAndReceive("http://localhost:8080/ws/fileupload", request);
	}
}

Szükségünk lesz még egy sorosító konfigurálására (MarshallerConfiguration.java):

package hu.infokristaly.forrasuploadsoapclient;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
 
@Configuration
public class MarshallerConfiguration {
 
	@Bean
	public Jaxb2Marshaller marshaller() {
		Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
		// meg kell egyeznie a csomagnévvel amit a pom.xml-ben meghatároztunk (jaxws-maven-plugin -> configuration ->packageName)
		marshaller.setContextPath("hu.infokristaly.forrasuploadsoapclient.wsdl");
		return marshaller;
	}
 
	@Bean
	public FileUploadClient fileUploadClient(Jaxb2Marshaller marshaller) {
		FileUploadClient client = new FileUploadClient();
		client.setDefaultUri("http://localhost:8080/ws");
		client.setMarshaller(marshaller);
		client.setUnmarshaller(marshaller);
		return client;
	}
 
}

Az alkalmazásunk pedig így indul:

package hu.infokristaly.forrasuploadsoapclient;
 
import hu.infokristaly.forrasuploadsoapclient.wsdl.UploadResponse;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
 
@SpringBootApplication
public class ForrasUploadSOAPClient {
 
	public static void main(String[] args) {
		SpringApplication.run(ForrasUploadSOAPClient.class, args);
	}
 
	@Bean
	CommandLineRunner lookup(FileUploadClient fileUploadClient) {
		return args -> {
			if (args.length > 0) {
				UploadResponse response = fileUploadClient.uploadFile(args[0]);
				System.err.println(response.getReturn());
			}
		};
	}
}

Hogy Tomcat szerver ne induljon, a pom.xml-be vegyük fel a spring-boot-starter-web-services függőséget a következőként:

<dependencies>
...
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web-services</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-tomcat</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
...
</dependencies>

Kód generálás

Ahhoz hogy a WSDL-ből osztályok legyenek, le kell fordítani azt a következő parancssal:

mvn compile

Ez a target könyvtárba a pom.xml-ben megadott csomagba létrehozza az osztályok forrását. Ha újra kell generálni az osztályokat, töröljük a target könvytárat.