欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

在springboot中创建webservice服务

时间:2023-06-10

        最近因为业务的需要,甲方让我在项目中提供webservice接口,然后他推送数据。然后我对甲方的那个技术说,你直接通过http的post访问我们的接口呗,然后他很无辜的用呆萌呆萌的语气和我说,啥post接口啊?接口不都是webservice的吗?再说了在sap中访问接口不就是用webservice吗?直接给我干不会了。我来这个新公司不长时间,因为业务的关系,以前没接触过sap的相关东西,sap是什么我也不知道,后来百度查了一下,我靠,好牛掰的样子,一套要十几万。我想,十几万的产品不能连post请求都办不到吧。算了,你说用webservice就用webservice吧,甲方是爹。

        然后,在创建webservice的过程中,遇到了许多的坑,躺了许多雷,为了避免大家采坑,现整理如下。

        首先是springboot的pom.xml文件,主要是引入以下依赖

javax.xml.bind jaxb-api 2.3.0 com.sun.xml.bind jaxb-impl 2.3.0 com.sun.xml.bind jaxb-core 2.3.0 javax.activation activation 1.1.1 org.springframework.bootspring-boot-starter-web-servicesorg.apache.cxfcxf-spring-boot-starter-jaxws3.3.1org.apache.cxfcxf-rt-transports-http3.2.2 org.codehaus.woodstoxstax2-api4.0.0org.codehaus.woodstoxwoodstox-core-asl4.4.1 org.apache.axisaxis1.4axisaxis-jaxrpc1.4commons-discoverycommons-discovery0.2wsdl4jwsdl4j1.6.3

 我的jdk环境是jdk11,所以要引入最开始的4个依赖。

还有,springboot的版本不能太高,我原先的版本是2.3.3,跑不起来,后来在网上查到是版本不兼容导致的问题,于是把springboot的版本降到2.0.1,后来才跑起来。


        org.springframework.boot
        spring-boot-starter-parent
         2.0.1.RELEASE
        
        
    

然后,新建webservice的接口文件,如下所示:

package com.mango.jkm.webservice;import java.util.List;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;@WebService(name = "Wbceshijk", targetNamespace = "http://server.webservice.example.com")public interface Wbceshijk {@WebMethod String emrService(@WebParam(name = "data") String data,@WebParam(name = "data2") String data2);@WebMethodString student1111(@WebParam(name = "data") String data,@WebParam(name = "data2") String data2);@WebMethodString aboutstudent(@WebParam(name="student") Student student);@WebMethodString studentlist(List list1);}

然后是接口的实现类

package com.mango.jkm.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.mango.jkm.webservice.Wbceshijk")public class Webserviceceshi implements Wbceshijk{@Override public String emrService( String data,String data2) { if(null == data || "".equals(data.trim())){ return "传入的参数为空"; } return "data="+data+"@data2="+data2; }@Overridepublic String student1111(String data, String data2) {// TODO 自动生成的方法存根return "22222data="+data+"@data2="+data2;}@Overridepublic String aboutstudent(Student student) {// TODO 自动生成的方法存根System.out.println(student==null);return "student.getName()="+student.getName();}@Overridepublic String studentlist(List list1) {// TODO 自动生成的方法存根return "list1.size()="+list1.size();}}

 再然后是webservice的配置相关

package com.mango.jkm.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;@Configurationpublic class WebServiceConfig { @Autowired private Wbceshijk serverServiceDemo; @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } // @Bean// public ServletRegistrationBean dispatcherServlet() {// return new ServletRegistrationBean(new CXFServlet(), "/soapprivate static final long serialVersionUID = 3428504463675931746L;public String name;public String address;public String age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "#" + this.name + "#";}}

 然后,启动springboot,访问对应的地址http://localhost:8081/service/ws/api?wsdl,得到熟悉的界面,可以看到webservice也启动成功了(webservice的端口号就是springboot项目自己的端口号)

然后,可以用soupui工具进行访问,

 

点击ok,就可以看到在接口文件中定义的4个方法

点击里面的emrService节点的request1,进行测试,可以看到返回数据结果

 

我感觉webservice也是post方式接口,因为我用apipost工具进行测试,body里放左侧的请求的xml,得到完全相同的的结果,为了验证我的猜想,我用springboot自带的RestTemplate类发送了一次post请求,发现也是得到了右侧的返回内容,这是我的测试类

package com.mango.jkm.webservice;import javax.xml.namespace.QName;import javax.xml.rpc.ParameterMode;import javax.xml.rpc.encoding.XMLType;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.ser.BeanDeserializerFactory;import org.apache.axis.encoding.ser.BeanSerializerFactory;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.web.client.RestTemplate;import com.alibaba.fastjson.JSONObject;public class WbClient {public static void invokeService3() { try { //1、直接引用远程的wsdl文件 String endpoint = "http://localhost:8081/service/ws/api?wsdl"; Service service = new Service(); Call call = (Call) service.createCall(); //创建服务 call.setTargetEndpointAddress(endpoint); //2、定义报名和接口方法 QName qn=new QName("http://server.webservice.example.com", //wsdl文件中的targetNamespace "aboutstudent"); call.setOperationName(qn); //3、设置参数 Student student=new Student(); student.setName("张小鑫"); student.setAddress("sssss"); student.setAge("10"); call.registerTypeMapping(Student.class,qn, new BeanSerializerFactory(Student.class, qn), new BeanDeserializerFactory(Student.class, qn)); call.addParameter("student", new QName("http://server.webservice.example.com", "Student"), javax.xml.rpc.ParameterMode.IN);// call.addParameter("student", org.apache.axis.encoding.XMLType.XSD_ANYTYPE,// javax.xml.rpc.ParameterMode.IN);//接口的参数 call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型 call.setUseSOAPAction(true); String result = (String)call.invoke(new Object[]{student}); System.out.println("result="+result); } catch (Exception e) { e.printStackTrace(); }}public static void invokeService_2(){ try { //1、直接引用远程的wsdl文件 String endpoint = "http://localhost:8081/service/ws/api?wsdl"; Service service = new Service(); Call call = (Call) service.createCall(); //创建服务 call.setTargetEndpointAddress(endpoint); //2、定义报名和接口方法 call.setOperationName(new QName("http://server.webservice.example.com", //wsdl文件中的targetNamespace "emrService") //接口实现功能的方法 ); //3、设置参数 call.addParameter("data", XMLType.XSD_STRING,ParameterMode.IN);// 接口的参数 call.addParameter("data2",XMLType.XSD_STRING,ParameterMode.IN);// 接口的参数 call.setReturnType(XMLType.XSD_STRING);// 设置返回类型 //4、给方法传递参数,并且调用方法 String result = (String) call.invoke(new Object[] {"1111" ,"2222"}); System.out.println("result="+result); } catch (Exception e) { e.printStackTrace(); }//}public static void restfangwen() {RestTemplate restTemplate = new RestTemplate();HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_XML);String xml="rn"+ " rn"+ " rn"+ " rn"+ " rn"+ " rn"+ " rn"+ " zxrn"+ " rn"+ " addressrn"+ " rn"+ " 18rn"+ " rn"+ " rn"+ " rn"+ "";HttpEntity requestEntity = new HttpEntity<>(xml, headers);ResponseEntity resEntity = restTemplate.postForEntity("http://localhost:8081/service/ws/api",requestEntity, String.class);String result=resEntity.getBody();System.out.println("str="+result);}public static void main(String[] args) {WbClient.restfangwen();}}

 在这个测试类中,我访问的是webservice里的aboutstudent方法,能得到对应的返回内容

str=student.getName()=zx

用axis能访问emrService方法,并且返回正确的数据。如果输入参数不是java基本类型而是类的话,怎么弄都不好使,网上各种办法都不好使,我也不知道为啥。各位大神如果你们成功了,就请在留言区说一下,小弟不胜感激。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。