Я создал SOAP сервис, следуя этому примеру в значительной степени к букве: https://dzone.com/articles/creating-a-soap-web-service-with-spring-boot-start
Но я хочу следовать коду сначала (снизу вверх) так что вместо того, чтобы писать xsd и генерировать java из него, я пишу java и генерирую xsd из него следующим образом:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<id>schemagen</id>
<goals>
<goal>schemagen</goal>
</goals>
<phase>generate-resources</phase>
<configuration>
<clearOutputDir>false</clearOutputDir>
<sources>
<source>../soapservice-api/src/main/java/techbasics/soapservice/api/v1</source>
</sources>
</configuration>
</execution>
</executions>
<configuration>
<verbose>true</verbose>
</configuration>
</plugin>
, а затем добавляем xsds в путь к классам, который затем используется для генерации WSDL. Это прекрасно работает, за исключением того, что jaxb2-maven-plugin выбирает только объекты, отмеченные аннотациями java.xml.bind
, такими как @XmlElement
и т. Д., И поэтому генерирует только объекты-модели в файлах xsd.
проблема в том, что я не знаю, как сделать различие guish между классами модели (которые генерируются нормально) и классом конечной точки, содержащим операции:
класс модели:
@NoArgsConstructor @AllArgsConstructor @Builder @Data
@XmlType(namespace = SoapService.NAMESPACE_URI_V1)
public class Person {
@XmlElement(name = "name")
private String name;
@XmlElement(name = "age")
private int age;
@XmlElementWrapper(name = "qualifications", nillable = true)
@XmlElement(name = "qualification")
private List<String> qualifications;
}
Класс обслуживания:
public class SoapService {
@PayloadRoot(namespace = "http://localhost:8000/soapService/v1", localPart = "processPerson")
@ResponsePayload
public ProcessedPerson processPerson(Person person) {
//do stuff
return return new ProcessedPerson();
}
}
Сгенерированные XSD:
schema1.xsd:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8000/soapService/v1" version="1.0">
<xs:complexType name="person">
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string"/>
<xs:element name="age" type="xs:int"/>
<xs:element minOccurs="0" name="qualifications" nillable="true">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="qualification" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="processedPerson">
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string"/>
<xs:element name="over18" type="xs:boolean"/>
<xs:element name="numberOfQualifications" type="xs:int"/>
</xs:sequence>
</xs:complexType>
schema2.xsd:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
<xs:complexType name="soapService">
<xs:sequence/>
</xs:complexType>
</xs:schema>
Конечно, это генерирует wsdl без каких-либо операций:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:sch="http://localhost:8000/soapService/v1"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost:8000/soapService/v1" targetNamespace="http://localhost:8000/soapService/v1">
<wsdl:types>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8000/soapService/v1" version="1.0">
<xs:complexType name="person">
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string"/>
<xs:element name="age" type="xs:int"/>
<xs:element minOccurs="0" name="qualifications" nillable="true">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="qualification" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="processedPerson">
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string"/>
<xs:element name="over18" type="xs:boolean"/>
<xs:element name="numberOfQualifications" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:portType name="SoapServiceV1Port"></wsdl:portType>
<wsdl:binding name="SoapServiceV1PortSoap11" type="tns:SoapServiceV1Port">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
</wsdl:binding>
<wsdl:service name="SoapServiceV1PortService">
<wsdl:port binding="tns:SoapServiceV1PortSoap11" name="SoapServiceV1PortSoap11">
<soap:address location="http://localhost:8000/soapservice/v1"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Как правильно генерировать XSD (и, следовательно, wsdl)?