spring-创建Webservice服务

       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{
	@WebMethod
    String emrService(@WebParam(name = "name") String name,@WebParam(name = "info") String info);
	@WebMethod
	String student1111(@WebParam(name = "name") String name,@WebParam(name = "info) String info);
	@WebMethod
	String aboutstudent(@WebParam(name="student") Student student);

	@WebMethod
	String studentlist(List 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{
 
	@Override
    public String emrService( String name,String info) {
        if(null == name|| "".equals(name.trim())){
            return "传入的参数为空";
        }
        return "name="+name+"@info="+info;
    }
 
	@Override
	public String student1111(String name, String info) {
		return "name="+name+"@info="+info;
	}
 
	@Override
	public String aboutstudent(Student student) {
		System.out.println(student==null);
		return "student.getName()="+student.getName();
	}
 
	@Override
	public String studentlist(List 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 {
 
    @Autowired
    private 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/*");
}
 
    @Bean
    public 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包中。

你可能感兴趣的:(java,#,spring,spring,java,后端)