Spring Boot Sping Boot -maven-jaxb 2-插件未生成所有类-WSDL的请求和响应

fquxozlt  于 2023-02-08  发布在  Spring
关注(0)|答案(1)|浏览(135)

我们有一个由API提供商提供的示例WSDL,我们希望与它集成。
我在https://spring.io/guides/gs/consuming-web-service/和其他一些.wsdl文件中尝试了提供的示例,看起来都不错。
在我使用wsdl的情况下--当运行生成类的命令时--只生成了其中的一部分,而不是全部。
SoapUI中的情况并非如此-那里一切都很好。
知道为什么会这样吗
我的pom.xml如下所示

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.13.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <generatePackage>com.test.xxx.soapclient.generated</generatePackage>
                    <generateDirectory>${project.basedir}/src/main/java</generateDirectory>
                    <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
                    <schemaIncludes>
                        <include>*.wsdl</include>
                    </schemaIncludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

我所看到的是只有complex types被创建为类,而其他的不是,在我的例子中,输入消息是下面的消息,没有为它生成类。
我该怎么做呢?这里有趣的是-soapAction有空字符串作为参数-Java的API需要SoapAction Java代码

public Object callWebService(String action, Object request){
        return getWebServiceTemplate().marshalSendAndReceive(request,new SoapActionCallback(action));
    }

实际WSDL文件

<operation name="login" parameterOrder="user password">
  <input message="tns:CardManagementEP_login"> </input>
  <output message="tns:CardManagementEP_loginResponse"> </output>
</operation>

<message name="CardManagementEP_loginResponse">
<part name="result" type="xsd:string"> </part>
</message>

<message name="CardManagementEP_login">
<part name="user" type="xsd:string"> </part>
<part name="password" type="xsd:string"> </part>
</message>

<operation name="login">
  <soap:operation soapAction=""/>
  <input>
  <soap:body use="literal" namespace="http://com.tch.cards.service"/>
  </input>
  <output>
  <soap:body use="literal" namespace="http://com.tch.cards.service"/>
  </output>
</operation>
umuewwlo

umuewwlo1#

我设法解决了这个问题的帮助下,达肖恩卡特从显示 Spring 办公时间。
问题是上面提到的WSDL文件太旧了,因此没有生成不复杂的请求/响应类。
我们所做的是修改现有的WSDL并将这些内容创建为复杂类型--这样Jaxb将为它们生成类
example-wsdl.wsdl

<complexType name="login">
    <sequence>
        <element name="user" type="string"/>
        <element name="password" type="string"/>
    </sequence>
</complexType>
<complexType name="loginResponse">
    <sequence>
        <element name="result" type="string"/>
    </sequence>
</complexType>

在那之后,类被生成了,但是它们对我不起作用,我不得不做一些手工修改来使它们起作用
LoginResponse.java

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "loginResponse", namespace = "http://com.tch.cards.service")
@XmlAccessorType(XmlAccessType.FIELD)
public class LoginResponse {

    @XmlElement(required = true)
    protected String result;
    public String getResult() {
        return result;
    }
    public void setResult(String value) {
        this.result = value;
    }
}

Login

import javax.xml.bind.annotation.*;
@XmlRootElement(name = "login", namespace = "http://com.tch.cards.service")
@XmlAccessorType(XmlAccessType.FIELD)
public class Login {

    @XmlElement(required = true)
    protected String user;
    @XmlElement(required = true)
    protected String password;
    public String getUser() {
        return user;
    }
    public void setUser(String value) {
        this.user = value;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String value) {
        this.password = value;
    }
}

另外,在我的例子中,Soap Action并不重要,我传递的是空字符串。
实际调用发生的代码如下所示:

Login login = new Login();
login.setUser("user");
login.setPassword("password");
LoginResponse response = (LoginResponse) soapConnector.callWebService("", login);
System.out.println(response);

重要说明:根据每个用例更改名称空间-这非常重要

相关问题