一,创建springboot项目
二,导入依赖
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.12</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.12</version>
</dependency>
<!--有两种发布方式,第一种直接在springboot启动类中使用Endpoint发布服务,
需要导入下面的jetty依赖,否则会报错:
Cannot find any registered HttpDestinationFactory from the Bus.
-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.6</version>
</dependency>
三,创建实体类,(这个根据自己需要,可以不创建)
public class User implements Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
四,创建接口,以及实现类
@WebService
@WebServiceProvider
public interface UserService {
@WebMethod
public User findUserById( String id) ;
@WebMethod
public String addUser(User user);
}
================================================================
public class UserServiceImpl implements UserService {
public User findUserById(String id) {
User user = new User();
user.setAge(12);
user.setName("haha");
return user;
}
public String addUser(User user) {
return "ok";
}
}
五,发布服务
第一种方式:直接在启动类中使用Endpoint,不需编写配置类,这种方式可以自定义webservice的端口,但不要和服务器的端口冲突了。(注意上面的pom依赖)
@SpringBootApplication
public class WebserviceApplication {
public static void main(String[] args) {
SpringApplication.run(WebserviceApplication.class, args);
Endpoint.publish("http://localhost:9999/webService/userService/", new UserServiceImpl());
}
}
第二种方式:使用配置类,不用在启动类中加Endpoint.publish,这种接口的端口号和服务器端口号是一致的。
@Configuration
public class CxfConfig {
@Bean
public ServletRegistrationBean disServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/webService/*");
return servletRegistrationBean;
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), new UserServiceImpl());
endpoint.publish("/userService");
return endpoint;
}
}
注意:网上很多教程的配置类中,第一个@Bean的方法名都是
public ServletRegistrationBean dispatcherServlet(){....}
这样会报错:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 1 of constructor in org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration required a bean of type 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath' that could not be found.
The following candidates were found but could not be injected:
- Bean method 'dispatcherServletRegistration' in 'DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration' not loaded because DispatcherServlet Registration found non dispatcher servlet dispatcherServlet
Action:
Consider revisiting the entries above or defining a bean of type 'org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath' in your configuration.
把那个方法名改一下,就行了!
然后就可以启动服务了,
访问localhost:port/webService/userService?wsdl
就能成功显示接口信息