springboot与spring-ws的webservice的Demo

先上一波依赖

<!-- https://mvnrepository.com/artifact/wsdl4j/wsdl4j -->
<dependency>
    <groupId>wsdl4j</groupId>
    <artifactId>wsdl4j</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web-services -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web-services</artifactId>
</dependency>


<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <id>xjc</id>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!--${project.basedir}  是内置属性,表示项目根目录,即包含pom.xml文件的目录-->
        <!--可以通过<schemaDirectory>标签指明xsd文件的位置-->
        <schemaDirectory>${project.basedir}/src/main/resources/xsd/</schemaDirectory>

        <!--可以通过 <outputDirectory>来指定jaxb2根据xsd文件生成实体类的位置-->
        <!--这里就是src/main/java下,然后jaxb2插件生成代码是以命名空间来确定包名。
        比如命名空间是http://test.com/webservice/pda
        那么就会在src/main/java下生成com/test/webservice/pda目录,并在此目录下生成对应代码。-->
        <outputDirectory>${project.basedir}/src/main/java</outputDirectory>

        <!--可以通过<clearOutputDir>设置重新生成代码时时候清除输出目录,默认是true,这里设置为false,要注意如果后期需要修改xsd文件并且可能会导致有重名的实体类时,修改为true。-->
        <clearOutputDir>true</clearOutputDir>
        <encoding>utf-8</encoding>
    </configuration>
</plugin>

gradle的依赖

configurations {
    
    
    jaxb
}

jar {
    
    
    baseName = 'gs-producing-web-service'
    version =  '0.1.0'
    from genJaxb.classesDir
}

// tag::dependencies[]
dependencies {
    
    
    compile("org.springframework.boot:spring-boot-starter-ws")
    compile("wsdl4j:wsdl4j:1.6.1")
    jaxb("com.sun.xml.bind:jaxb-xjc:2.2.4-1")
    compile(files(genJaxb.classesDir).builtBy(genJaxb))
}


task genJaxb {
    
    
    ext.sourcesDir = "${
    
    buildDir}/generated-sources/jaxb"
    ext.classesDir = "${
    
    buildDir}/classes/jaxb"
    ext.schema = "src/main/resources/countries.xsd"

    outputs.dir classesDir

    doLast() {
    
    
        project.ant {
    
    
            taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask",
                    classpath: configurations.jaxb.asPath
            mkdir(dir: sourcesDir)
            mkdir(dir: classesDir)

            xjc(destdir: sourcesDir, schema: schema) {
    
    
                arg(value: "-wsdl")
                produces(dir: sourcesDir, includes: "**/*.java")
            }

            javac(destdir: classesDir, source: 1.6, target: 1.6, debug: true,
                    debugLevel: "lines,vars,source",
                    classpath: configurations.jaxb.asPath) {
    
    
                src(path: sourcesDir)
                include(name: "**/*.java")
                include(name: "*.java")
            }

            copy(todir: classesDir) {
    
    
                fileset(dir: sourcesDir, erroronmissingdir: false) {
    
    
                    exclude(name: "**/*.java")
                }
            }
        }
    }
}



再上一波xsd文件

<xs:schema
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:tns="http://test.com/webservice/pda" targetNamespace="http://test.com/webservice/pda" elementFormDefault="qualified">
    <xs:element name="PdaLoginRequest">
        <xs:complexType>
            <xs:sequence>
                <!--<xs:element name="username" type="xs:string"/>表示是string类型的username。 string是自带类型,-->
                <xs:element name="username" type="xs:string"/>
                <xs:element name="password" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="PdaLoginResponse">
        <xs:complexType>
            <xs:sequence>
                <!--自定义类型引用demo-->
                <xs:element name="request-result" type="tns:LoginRequestResult"/>
                <xs:element name="menu-result" type="tns:MenuList"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="MenuList">
        <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="unbounded" name="menu" nillable="true" type="tns:Menu"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Menu">
        <xs:sequence>
            <xs:element name="menu" type="xs:string"/>
            <xs:element name="url" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="LoginRequestResult">
        <xs:sequence>
            <xs:element name="request_result" type="xs:boolean"/>
            <xs:element name="result_desc" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

然后生成java类

maven的话可以直接install或者package,因为我这边用的maven管理的依赖
在这里插入图片描述

java类生成后开始实现配置类

package com.fchan.webservicedemo.webservice.config;

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.config.annotation.WsConfigurerAdapter;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
import org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition;
import org.springframework.xml.xsd.SimpleXsdSchema;
import org.springframework.xml.xsd.XsdSchema;

@Configuration
@EnableWs
public class WebServiceConfig extends WsConfigurerAdapter {
    
    

    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
    
    
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        //待会访问wsdl的时候就是 ip + port + /ws + pda2wms.wsdl 这个'pda2wms'就是下面pdaWsdl11Definition方法定义的BeanName
        //http://localhost:8080/ws/pda2wms.wsdl
        return new ServletRegistrationBean(servlet, "/ws/*");
    }


    @Bean(name = "pda2wms")
    public DefaultWsdl11Definition pdaWsdl11Definition(XsdSchema pda2wmsSchema) {
    
    
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("WmsPort");
        wsdl11Definition.setLocationUri("/ws");
        wsdl11Definition.setTargetNamespace("http://test.com/webservice/pda");
        wsdl11Definition.setSchema(pda2wmsSchema);
        return wsdl11Definition;
    }

    @Bean
    public XsdSchema pda2wmsSchema() {
    
    
        return new SimpleXsdSchema(new ClassPathResource("/xsd/test.xsd"));
    }

}

然后实现Enpoint

package com.fchan.webservicedemo.webservice;

import com.test.webservice.pda.*;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

/*@Endpoint作用类似于@Controller*/
@Endpoint
public class PdaEndpoint {
    
    

    private static final String NAMESPACE_URI = "http://test.com/webservice/pda";

    /*@PayloadRoot(namespace = NAMESPACE_URI, localPart = "PdaLoginRequest")声明命名空间,要与xsd文件中的一致。*/
    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "PdaLoginRequest")
    /*@ResponsePayload 必加,方法的返回类型要与xsd定义的请求类型一致,方法参数里请求类型要与xsd文件中的一致。*/
    @ResponsePayload
    public PdaLoginResponse statusFeedbacke(@RequestPayload PdaLoginRequest request){
    
    
        PdaLoginResponse pdaLoginResponse = new PdaLoginResponse();
        LoginRequestResult loginRequestResult = new LoginRequestResult();
        loginRequestResult.setRequestResult(false);
        loginRequestResult.setResultDesc("qqq");
        pdaLoginResponse.setRequestResult(loginRequestResult);

        MenuList menuList = new MenuList();
        Menu menu = new Menu();
        menu.setMenu("111");
        menu.setUrl("111");
        menuList.getMenu().add(menu);

        pdaLoginResponse.setMenuResult(menuList);
        return pdaLoginResponse;
    }

}

最后使用soapui或者postman测试一波就ok了

在这里插入图片描述

在这里插入图片描述

参考了大佬的博文
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/89395156

https://www.cnblogs.com/huang0925/p/3958565.html

猜你喜欢

转载自blog.csdn.net/weixin_43944305/article/details/114065343