SOAP (Simple Object Access Protocol) is a normalized exchange protocol based on XML, predating the era of REST services.
This extension enables you to develop web services that consume and produce SOAP payloads using the Apache CXF libraries.
This project builds upon a considerable amount of work done as part of a separate effort. Please review CREDITS.md for more details.
After configuring quarkus-universe BOM
:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-universe-bom</artifactId>
<version>${insert.newest.quarkus.version.here}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
You can just configure the quarkus-cxf
extension by adding the following dependency:
<dependency>
<groupId>com.github.shumonsharif</groupId>
<artifactId>quarkus-cxf</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
In this example, we will create an application to manage a list of fruits.
First, let's create the Fruit
bean as follows:
package org.acme.cxf;
import java.util.Objects;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlType(name = "Fruit")
@XmlRootElement
public class Fruit {
private String name;
private String description;
public Fruit() {
}
public Fruit(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
@XmlElement
public void setDescription(String description) {
this.description = description;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Fruit)) {
return false;
}
Fruit other = (Fruit) obj;
return Objects.equals(other.getName(), this.getName());
}
@Override
public int hashCode() {
return Objects.hash(this.getName());
}
}
Now, create the org.acme.cxf.FruitWebService
class as follows:
package org.acme.cxf;
import java.util.Set;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public interface FruitWebService {
@WebMethod
Set<Fruit> list();
@WebMethod
Set<Fruit> add(Fruit fruit);
@WebMethod
Set<Fruit> delete(Fruit fruit);
}
Then, create the org.acme.cxf.FruitWebServiceImpl
class as follows:
package org.acme.cxf;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Set;
import javax.jws.WebService;
@WebService(endpointInterface = "org.acme.cxf.FruitWebService")
public class FruitWebServiceImpl implements FruitWebService {
private Set<Fruit> fruits = Collections.newSetFromMap(Collections.synchronizedMap(new LinkedHashMap<>()));
public FruitWebServiceImpl() {
fruits.add(new Fruit("Apple", "Winter fruit"));
fruits.add(new Fruit("Pineapple", "Tropical fruit"));
}
@Override
public Set<Fruit> list() {
return fruits;
}
@Override
public Set<Fruit> add(Fruit fruit) {
fruits.add(fruit);
return fruits;
}
@Override
public Set<Fruit> delete(Fruit fruit) {
fruits.remove(fruit);
return fruits;
}
}
The implementation is pretty straightforward and you just need to define your endpoints using the application.properties
.
quarkus.cxf.path=/cxf
quarkus.cxf.endpoint."/fruit".implementor=org.acme.cxf.FruitWebServiceImpl
The following sample curl command can be used to test your Fruit service.
curl -X POST "http://localhost:8080/cxf/fruit" \
-H 'Content-Type: text/xml' \
-H 'SOAPAction:' \
-d '
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cxf="http://cxf.acme.org/">
<soapenv:Header/>
<soapenv:Body>
<cxf:list/>
</soapenv:Body>
</soapenv:Envelope>'
In order to support only SOAP client, register endpoint URL and the service endpoint interface (same as the server) with configuration:
quarkus.cxf.endpoint."/fruit".client-endpoint-url=http://localhost:8080/
quarkus.cxf.endpoint."/fruit".service-interface=org.acme.cxf.FruitWebService
Then inject the client to use it:
public class MySoapClient {
@Inject
FruitWebService clientService;
public int getCount() {
return clientService.count();
}
}