Мой первый подход к коду для SOAP весной не правильно генерирует XSD и WSDL - PullRequest
0 голосов
/ 03 мая 2020

Я создал 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)?

...