WebService使用

java发布WebService

普通maven项目,使用原生jdk发布webservice

1.pom

 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
	</dependency>
	
  </dependencies>

2.接口

import javax.jws.WebService;
import javax.jws.WebParam;

/**
 * 对外发布服务的接口	
 * */
@WebService//(targetNamespace = "http://wsImpl.com/")
public interface HelloWs {
	
	public String sayHello(@WebParam(name="arg0")String name);
}

3.实现类

import java.util.HashMap;
import com.alibaba.fastjson.JSONObject;
import com.ws.HelloWs;


public class HelloWsImpl implements HelloWs{

	public String sayHello(String name) {
	    String jsonStr = json();
		System.out.print(name);
		return jsonStr;
	}
	
	
	//将map变成json并通过报文返回
	public String mapJson(){
		HashMap<String, Object> zhangsan = new HashMap<String, Object>();
        zhangsan.put("name", "张三");
        zhangsan.put("age", 18.4);
        zhangsan.put("birthday", "1900-20-03");
        zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
        zhangsan.put("null", null);
        zhangsan.put("house", false);
        //System.out.println(new JSONObject(zhangsan).toString());
        String jsonStr = new JSONObject(zhangsan).toString();
	// TODO Auto-generated method stub
        return jsonStr;
	}
	
	//原生json并通过报文返回
	public String json(){
		JSONObject zhangsan = new JSONObject();
		zhangsan.put("name", "张三");
	    zhangsan.put("age", 18.4);
	    zhangsan.put("birthday", "1900-20-03");
	    zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
	    zhangsan.put("null", null);
	    zhangsan.put("house", false);
	    return zhangsan.toString();   
	}

}

4.发布类

主方法运行后,直接在浏览器访问http://ip:8080/ws/hello?wsdl

import javax.xml.ws.Endpoint;
import com.wsImpl.HelloWsImpl;


public class Service {

	public static void main(String[] args) {
		//设置服务地址,换成你的ip
		Endpoint.publish("http://10.10.150.20:8080/ws/hello",new HelloWsImpl());
		
		System.out.println("发布WS服务成功");
	}

}

5.调用方法

import java.io.IOException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.ws.HelloWs;


public class ProtoCall {
    public static void main(String[] args) throws IOException {
        //创建WSDL地址,不是服务地址
        URL url = new URL("http://10.10.150.20:8080/ws/hello?wsdl");

        /**
         * QName是XML元素的限定名称,是组成XML的最基本的要素
         * */
        //创建服务名称
        //1.namespaceURI - 命名空间地址
        //2.localPart - 服务名称,wsdl中的name,不是@WebService注解中的name
        QName qname = new QName("http://wsImpl.com/", "HelloWsImplService");
        //Service创建视图
        //参数:
        //1.wsdlDocumentLocation - 使用说明书地址
        //2.serviceName - 服务名称
        Service service = Service.create(url, qname);
        //获取实现类
        HelloWs mobileCodeWSSoap = service.getPort(HelloWs.class);
        //调用查询方法
        String result = mobileCodeWSSoap.sayHello("188888888");
        System.out.println(result);
    }
}

CXF发布WebService

普通maven项目,使用apache.cxf发布webservice

1.pom

 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
      <dependency>
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-frontend-jaxws</artifactId>
    	<version>3.4.3</version>
	</dependency>
    
    <dependency><!-- 内置jetty web服务器 -->
    	<groupId>org.apache.cxf</groupId>
    	<artifactId>cxf-rt-transports-http-jetty</artifactId>
    	<version>3.4.3</version>
    	<scope>test</scope>
	</dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>
  </dependencies>

2.接口

import javax.jws.WebService;
import javax.jws.WebParam;

/**
 * 对外发布服务的接口	
 * */
@WebService//(targetNamespace = "http://wsImpl.com/")
public interface HelloWs {
	
	public String sayHello(@WebParam(name="arg0")String name);
}

3.实现类

import java.util.HashMap;
import com.alibaba.fastjson.JSONObject;
import com.ws.HelloWs;


public class HelloWsImpl implements HelloWs{

	public String sayHello(String name) {
	    String jsonStr = json();
		System.out.print(name);
		return jsonStr;
	}
	
	
	//将map变成json并通过电文返回
	public String mapJson(){
		HashMap<String, Object> zhangsan = new HashMap<String, Object>();
        zhangsan.put("name", "张三");
        zhangsan.put("age", 18.4);
        zhangsan.put("birthday", "1900-20-03");
        zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
        zhangsan.put("null", null);
        zhangsan.put("house", false);
        //System.out.println(new JSONObject(zhangsan).toString());
        String jsonStr = new JSONObject(zhangsan).toString();
	// TODO Auto-generated method stub
        return jsonStr;
	}
	
	//原生json并通过电文返回
	public String json(){
		JSONObject zhangsan = new JSONObject();
		zhangsan.put("name", "张三");
	    zhangsan.put("age", 18.4);
	    zhangsan.put("birthday", "1900-20-03");
	    zhangsan.put("majar", new String[] {"哈哈","嘿嘿"});
	    zhangsan.put("null", null);
	    zhangsan.put("house", false);
	    return zhangsan.toString();   
	}

}

4.发布类

主方法运行后,直接在浏览器访问http://ip:8080/ws/hello?wsdl

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;


import com.wsImpl.HelloWsImpl;

public class Service {

	public static void main(String[] args) {
        
         /**
        	EndpointImpl发布方式
        */
		//EndpointImpl publish = (EndpointImpl) Endpoint.publish("http://10.10.150.20:8080/ws/hello",new HelloWsImpl());
		//publish.getOutInterceptors().add(new LoggingOutInterceptor());
		//publish.getInInterceptors().add(new LoggingInInterceptor());

		
        /**
        	工厂发布方式
        */
        //发布服务的工厂
		JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
		
		//设置服务地址,换成你的ip
		factory.setAddress("http://10.10.150.20:8080/ws/hello");
		
		//设置服务类
		factory.setServiceBean(new HelloWsImpl());
		
		//添加日志输入输出拦截器
		factory.getInInterceptors().add(new LoggingInInterceptor());  
        factory.getOutInterceptors().add(new LoggingOutInterceptor());
		
		//发布服务
		factory.create();
		
		System.out.println("发布WS服务成功");
	}

}

5.调用方法

import java.io.IOException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import com.ws.HelloWs;


public class ProtoCall {
    public static void main(String[] args) throws IOException {
        //创建WSDL地址,不是服务地址
        URL url = new URL("http://10.10.150.20:8080/ws/hello?wsdl");

        /**
         * QName是XML元素的限定名称,是组成XML的最基本的要素
         * */
        //创建服务名称
        //1.namespaceURI - 命名空间地址
        //2.localPart - 服务名称,wsdl中的name,不是@WebService注解中的name
        QName qname = new QName("http://wsImpl.com/", "HelloWsImplService");
        //Service创建视图
        //参数:
        //1.wsdlDocumentLocation - 使用说明书地址
        //2.serviceName - 服务名称
        Service service = Service.create(url, qname);
        //获取实现类
        HelloWs mobileCodeWSSoap = service.getPort(HelloWs.class);
        //调用查询方法
        String result = mobileCodeWSSoap.sayHello("188888888");
        System.out.println(result);
    }
}

整合SpringBoot发布及调用

1.pom依赖

<dependencies>
        <!-- 核心启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- web启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- webService-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <!-- CXF webservice -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-ws-security</artifactId>
            <version>3.2.1</version>
        </dependency>
        <!-- CXF webservice -->

        <!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery -->
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.3</version>
        </dependency>

        <!-- Restful接口依赖,用于rest风格接口 -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
            <version>3.1.12</version>
        </dependency>

        <dependency>
            <groupId>org.wso2.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.1.wso2v1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.axis/axis -->
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis</artifactId>
            <version>1.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/javax.xml/jaxrpc -->
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxrpc</artifactId>
            <version>1.1</version>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.0.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery -->
        <dependency>
            <groupId>commons-discovery</groupId>
            <artifactId>commons-discovery</artifactId>
            <version>0.5</version>
        </dependency>


        <!-- 阿里JSON解析器 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.18.Final</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>


    </dependencies>

2.创建接口及实现类

接口

@WebService: 标记此接口为WebService接口;name为接口名称,targetNamespace为名称空间,可以自定义;

@WebMethod: 标记方法为WebService接口中的方法

@WebParam: 标记参数为WebService接口中方法参数,可限定名称(name = “abdc”),不限定默认为方法参数变量名

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding;

@WebService(name = "ServerServiceDemo", targetNamespace = "http://server.webservice.example.com")
//@BindingType(value = SOAPBinding.SOAP12HTTP_BINDING)//将SOAP协议定义为1.2 Eclipse自带的WebService Brower只能解析soap1.1的协议,服务器端最好使用高版本的协议
public interface ServerServiceDemo {
    @WebMethod
    String emrService(@WebParam String data);
}

实现类

@WebService: 标记此接口为WebService接口;name为接口名称,targetNamespace为名称空间,可以自定义;endpointInterface为此类实现接口的全路径

@WebParam: 标记参数为WebService接口中方法参数,可限定名称(name = “abdc”),不限定默认为方法参数变量名

import com.alibaba.fastjson.JSONObject;
import com.demo.axisDemo.service.ServerServiceDemo;
import org.springframework.stereotype.Component;
import javax.jws.WebParam;
import javax.jws.WebService;


@Component
@WebService(name = "ServerServiceDemo", targetNamespace = "http://server.webservice.example.com",
        endpointInterface = "com.demo.axisDemo.service.ServerServiceDemo")
public class ServerServiceDemoImpl implements ServerServiceDemo {

    @Override
    public String emrService(@WebParam String data) {
        if (null == data || "".equals(data.trim())) {
            return "传入的参数为空";
        }
        System.out.println(data + "     -------------------------");
        return "服务端返回 调用成功:" + data;
    }
}

3.编写配置类

@Configuration
public class WebServiceConfig {
	
	/**
	  引入接口类
	*/
    @Autowired
    private ServerServiceDemo serverServiceDemo;
 	
 	
 	
 	/**
     * 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();
    }
    
    
    /* 
     * 此方法作用是改变项目中服务名的前缀名
     * 此方法被注释后, 即不改变前缀名(默认是services), wsdl访问地址为 http://127.0.0.1:8080/services/ws/api?wsdl
     * 去掉注释后wsdl访问地址为:http://127.0.0.1:8080/soap/ws/api?wsdl
    //@Bean 
    //public ServletRegistrationBean dispatcherServlet() {
    //    return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
    //}
    
    
    
    /**
     * 此处的EndpointImpl构造方法源码调用了JaxWsServiceFactoryBean及WebServiceFeature,
     * 即在bus中开启webservice功能,并通过JaxWsServiceFactoryBean获取一个具体服务
     *
     * EndpointImpl端点对象,可以将其作用理解为连接bus与java WS服务
     * WebServiceFeature 用于表示可以为 Web 服务启用或禁用的功能。
     * */
    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), serverServiceDemo);//363
        endpoint.publish("/ws/api");
        return endpoint;    
    }
    
    
}

4.客户端调用

Axis调用

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.helpers.DOMUtils;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import java.net.URL;


public class CallUtiles {

	//接口地址
    private static String publishUrl = "http://localhost:8080/services/ws/api?wsdl";

    //wsdl中的targetNamespace
    private static String nameSpaceURI = "http://server.webservice.example.com";
    

    public static String get(String userStr) throws Exception {

        Service service = new Service();
        Call call = (Call) service.createCall();
        call.setTargetEndpointAddress(new URL(publishUrl));
        
        //指定接口路径,要调用的方法名
        call.setOperationName(new QName(nameSpaceURI, "emrService"));
        
        //如果没用@WebParam(name="name")来表明参数名,则方法的入参是啥,这边就必须传一样的参数名才行。不然报错。
        call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN);
        
        call.setReturnType(XMLType.XSD_STRING);


        Object[] obj = new Object[]{userStr};
        String result = (String) call.invoke(obj);
        return result;
    }

}

java原生调用

import com.demo.axisDemo.service.ServerServiceDemo;
import java.io.IOException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;


public class ProtoCall {
    public static void main(String[] args) throws IOException {
        //创建WSDL地址,不是服务地址
        URL url = new URL("http://127.0.0.1:9088/api/Domain/Xinda-ESB/esb-ec2erp?wsdl");

        /**
         * QName是XML元素的限定名称,是组成XML的最基本的要素
         * */
        //创建服务名称
        //1.namespaceURI - 命名空间地址
        //2.localPart - 服务名称,wsdl中的name,不是@WebService注解中的name
        QName qname = new QName("http://service.erp.esb.xinda.com/IDTIWSReceEC", "IDTIWSReceEC");
        //Service创建视图
        //参数:
        //1.wsdlDocumentLocation - 使用说明书地址
        //2.serviceName - 服务名称
        Service service = Service.create(url, qname);
        //获取实现类
        ServerServiceDemo mobileCodeWSSoap = service.getPort(ServerServiceDemo.class);
        //调用查询方法
        String result = mobileCodeWSSoap.emrService("188888888");
        System.out.println(result);
    }
}

命令工具调用

cmd输入命令:wsdl2java -p com -d ../src -client -encoding utf-8  http://localhost:8080/admin/cxfService?wsdl

注意:wsdl地址必须与发布publish中的相同,执行后会在../src生成代码,直接使用实现类get方法调用
  • 29
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值