先上一波依赖
<!-- 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