Web service是一个平台独立的,松耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。webservice用的是soap协议。
客户通过发送请求(大部分是 XML消息)来召唤 WebServices ,而服务则返回 XML 响应。WebServices 通过网络调用通信,
HTTP作为两个框架之间的网络公认的最广泛的方法。Web 服务等效于 SOA (面向服务的体系结构) ,并且从根本上依赖于度量,例如 XML-RPC和 SOAP (简单对象访问协议)。
Java项目中可以使用注解 @WebService 注解,你可以将普通的 Java 类转换成可发布为 Web 服务的类。 @WebService 是 Java API for XML Web Services(JAX-WS)中的注解,用于标识一个类或接口作为一个可通过网络访问的 Web 服务。
@WebService注解
@WebService-定义服务,有以下配置项
targetNamespace:指定命名空间,一般是接口的包名倒序
name:portType的名称,客户端生成代码时 为接口名称
portName:port的名称
serviceName:服务名称
endpointInterface:SEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。
类上添加注解@WebService,则
类中所有 非静态方法 都会被发布;静态方法和 final 方法不能被发布;方法上加@WebMentod(exclude=true)后,此方法不被发布
@WebMethod注解
@WebMethod-定义方法,在公开方法上边
operationName:方法名
exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false
@WebParam
@WebParam-定义参数,在方法参数前边
name:指定参数的名称
@WebResult
@WebResult-定义返回值,在方法返回值前边
name:返回结果值的名称
首先先实现一个接口:
package com.zhong.test.webservice;import java.util.List;import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;@WebService(name = "WebServiceTest", targetNamespace = "http://server.webservice.example.com")
public interface WebServiceTest{@WebMethodString emrService(@WebParam(name = "name") String name,@WebParam(name = "info") String info);@WebMethodString student1111(@WebParam(name = "name") String name,@WebParam(name = "info) String info);@WebMethodString aboutstudent(@WebParam(name="student") Student student);@WebMethodString studentlist(List<Student> list1);
}
然后在想要实现的服务中实现接口:
package com.zhong.test.webservice;import java.util.List;import javax.jws.WebParam;
import javax.jws.WebService;import org.springframework.stereotype.Component;@Component
@WebService( targetNamespace = "http://server.webservice.example.com",endpointInterface = "com.zhong.test.webservice.WebServiceTest")
public class WebServicecTestImp implements WebServiceTest{@Overridepublic String emrService( String name,String info) {if(null == name|| "".equals(name.trim())){return "传入的参数为空";}return "name="+name+"@info="+info;}@Overridepublic String student1111(String name, String info) {return "name="+name+"@info="+info;}@Overridepublic String aboutstudent(Student student) {System.out.println(student==null);return "student.getName()="+student.getName();}@Overridepublic String studentlist(List<Student> list1) {return "list1.size()="+list1.size();}}
然后再配置文件中注入配置;
package com.zhong.test.webservice;import javax.xml.ws.Endpoint;import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class WebServiceConfig {@Autowiredprivate WebServiceTest webServiceTest;/*** Apache CXF 核心架构是以BUS为核心,整合其他组件。* Bus是CXF的主干, 为共享资源提供一个可配置的场所,作用类似于Spring的ApplicationContext,这些共享资源包括* WSDl管理器、绑定工厂等。通过对BUS进行扩展,可以方便地容纳自己的资源,或者替换现有的资源。默认Bus实现基于Spring架构,* 通过依赖注入,在运行时将组件串联起来。BusFactory负责Bus的创建。默认的BusFactory是SpringBusFactory,对应于默认* 的Bus实现。在构造过程中,SpringBusFactory会搜索META-INF/cxf(包含在 CXF 的jar中)下的所有bean配置文件。* 根据这些配置文件构建一个ApplicationContext。开发者也可以提供自己的配置文件来定制Bus。* 非必要项*/@Bean(name = Bus.DEFAULT_BUS_ID)public SpringBus springBus() {return new SpringBus();}/***** 这里需要注意 由于springmvc 的核心类 为DispatcherServlet,此处若不重命名此bean的话 原本的mvc就被覆盖了。可查看配置类:DispatcherServletAutoConfiguration* 一种方法是修改方法名称 或者指定bean名称,* 这里需要注意 若beanName命名不是 cxfServletRegistration 时,会创建两个CXFServlet的。具体可查看下自动配置类:Declaration org.apache.cxf.spring.boot.autoconfigure.CxfAutoConfiguration** 也可以不设置此bean 直接通过再application中的配置项 cxf.path 来修改访问路径的* http://127.0.0.1:8080/soap/列出服务列表 或 http://127.0.0.1:8080/soap/ws/api?wsdl 查看实际的服务*/
@Bean("cxfServletRegistration")
public ServletRegistrationBean dispatcherServlet() {//注册servlet 拦截/ws 开头的请求 不设置 默认为:/services/*return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
}@Beanpublic Endpoint endpoint() {EndpointImpl endpoint = new EndpointImpl(springBus(), webServiceTest);endpoint.publish("/ws/api");return endpoint;}
}
测试的时候也可以使用一下方式测试:
ublicstatic void main(String[] args) { /*** 参数1:服务的发布地址* 参数2:服务的实现者*/ Endpoint.publish("http://192.168.24.138:456/helloWord",new WebServiceTestImpl()); }
EndPoint
是 jdk 提供的一个专门用于发布服务的类,该类的publish()
方法接收两个参数,一个是本地的服务地址,二是提供服务的类。位于javax.xml.ws.Endpoint包中。