springboot整合cxf发布webservice以及调用的方法

2025-05-29 0 58

webservice性能不高,但是现在好多公司还是在用,恰好今天在开发的时候对接项目组需要使用到webservice下面来说下简单的案例应用

首先老规矩:引入jar包

?

1

2

3

4

5
<dependency>

<groupid>org.apache.cxf</groupid>

<artifactid>cxf-spring-boot-starter-jaxws</artifactid>

<version>3.1.11</version>

</dependency>

新增一个公共的返回实体类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30
public class baseresult {

private string issuccess;

private string errcode;

private string message;

public string getissuccess() {

return issuccess;

}

public void setissuccess(string issuccess) {

this.issuccess = issuccess;

}

public string geterrcode() {

return errcode;

}

public void seterrcode(string errcode) {

this.errcode = errcode;

}

public string getmessage() {

return message;

}

public void setmessage(string message) {

this.message = message;

}

}

其他类继承即可

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
@xmlrootelement(name = "testresult")

public class testresult extends baseresult implements serializable {

private static final long serialversionuid = -7128575337024823798l;

private list<user> data;

public list<user> getdata() {

return data;

}

public void setdata(list<user> data) {

this.data = data;

}

}

新增user类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25
public class user {

private string name;

private int age;

public user(string name, int age) {

super();

this.name = name;

this.age = age;

}

public user() {

super();

}

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;

}

}

接下来新增服务接口

?

1

2

3

4

5

6
@webservice

public interface testwservice{

@webmethod

@webresult

testresult list3();

}

实现服务接口

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
@service

@webservice(targetnamespace = "http://ws.**.com/",//命名空间,一般是接口的包名倒序)

endpointinterface = "com.**.ws.testwsservice")//接口全路径

//**自己改自己的包路径

public class testwsservice impl implements testwsservice {

@override

public testresult list3() {

list<user> list = new arraylist<user>();

list.add(new user("张三",23));

list.add(new user("李四",24));

testresult testresult = new testresult();

testresult.setissuccess("y");

testresult.setdata(list);

testresult.setmessage("操作成功");

return testresult;

}

}

新增配置类,发布服务

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45
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;

import com.hikvision.hikserviceassign.ws.monitorsurveyws;

import com.hikvision.hikserviceassign.ws.smartlockserviceorderws;

/**

* webservice 发布服务类

* @author xupx

* @date 2018年8月14日 下午4:25:25

*

*/

@configuration

public class cxfconfig {

@autowired

private testwservice testwservice;

@suppresswarnings("all")

@bean

public servletregistrationbean wsservlet() {

servletregistrationbean bean = new servletregistrationbean(new cxfservlet(), "/soap/*");

return bean;

}

@bean(name = bus.default_bus_id)

public springbus springbus() {

return new springbus();

}

@bean

public endpoint testwservice() {

//会找到o2owebservice的实现类,所以实现类只能有一个

endpointimpl endpoint = new endpointimpl(springbus(), testwservice);

endpoint.publish("/testwservice");

return endpoint;

}

}

启动项目,然后打开路径:localhost:8080/soap 可以查看多个自己发布的服务,如果要发布多个服务,使用多个bean即可

测试调用1:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21
import org.apache.cxf.endpoint.client;

import org.apache.cxf.jaxws.endpoint.dynamic.jaxwsdynamicclientfactory;

import org.junit.test;

import org.junit.runner.runwith;

import org.springframework.boot.test.context.springboottest;

import org.springframework.test.context.junit4.springrunner;

@runwith(springrunner.class)

@springboottest

public class springbootcxfapplicationtests {

@test

public void contextloads() throws exception {

jaxwsdynamicclientfactory dcf = jaxwsdynamicclientfactory.newinstance();

client client = dcf.createclient("http://127.0.0.1:8080/soap/testwservice?wsdl");

object[] objects = client.invoke("list3",param1,param2);//list3方法名 后面是可变参数

//输出调用结果

system.out.println(objects[0].getclass());

system.out.println(objects[0].tostring());

}

}

客户端调用,用soapui生成客户端(具体方法自己百度下,不介绍了)

?

1

2

3

4
testwsimplservice implservice = new testwsimplservice ();

testservicews ws = implservice.gettestservicewsimplport();

testresult result = ws.list3();

system.err.println(result);

增加密码校验,以下基础内容引用https://www.zzvips.com/article/165939.html,我补充下包依赖

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39
import javax.xml.namespace.qname;

import org.apache.cxf.binding.soap.soapmessage;

import org.apache.cxf.headers.header;

import org.apache.cxf.helpers.domutils;

import org.apache.cxf.interceptor.fault;

import org.apache.cxf.phase.abstractphaseinterceptor;

import org.apache.cxf.phase.phase;

import org.w3c.dom.document;

import org.w3c.dom.element;

public class logininterceptor extends abstractphaseinterceptor<soapmessage> {

private string username="root";

private string password="admin";

public logininterceptor(string username, string password) {

//设置在发送请求前阶段进行拦截

super(phase.prepare_send);

this.username=username;

this.password=password;

}

@override

public void handlemessage(soapmessage soapmessage) throws fault {

list<header> headers = soapmessage.getheaders();

document doc = domutils.createdocument();

element auth = doc.createelementns("http://cxf.wolfcode.cn/","securityheader");

element username = doc.createelement("username");

element userpass = doc.createelement("password");

username.settextcontent(username);

userpass.settextcontent(password);

auth.appendchild(username);

auth.appendchild(userpass);

headers.add(0, new header(new qname("securityheader"),auth));

}

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56
import java.util.list;

import javax.xml.soap.soapexception;

import org.apache.commons.lang3.stringutils;

import org.apache.cxf.binding.soap.soapheader;

import org.apache.cxf.binding.soap.soapmessage;

import org.apache.cxf.interceptor.fault;

import org.apache.cxf.phase.abstractphaseinterceptor;

import org.apache.cxf.phase.phase;

import org.w3c.dom.element;

import org.w3c.dom.nodelist;

import org.apache.cxf.headers.header;

public class authinterceptor extends abstractphaseinterceptor<soapmessage> {

private static final string username="root";

private static final string password="admin";

public authinterceptor() {

//定义在哪个阶段进行拦截

super(phase.pre_protocol);

}

@override

public void handlemessage(soapmessage soapmessage) throws fault {

list<header> headers = null;

string username=null;

string password=null;

try {

headers = soapmessage.getheaders();

} catch (exception e) {

e.printstacktrace();

}

if (headers == null) {

throw new fault(new illegalargumentexception("找不到header,无法验证用户信息"));

}

//获取用户名,密码

for (header header : headers) {

soapheader soapheader = (soapheader) header;

element e = (element) soapheader.getobject();

nodelist usernamenode = e.getelementsbytagname("username");

nodelist pwdnode = e.getelementsbytagname("password");

username=usernamenode.item(0).gettextcontent();

password=pwdnode.item(0).gettextcontent();

if( stringutils.isempty(username)||stringutils.isempty(password)){

throw new fault(new illegalargumentexception("用户信息为空"));

}

}

//校验用户名密码

if(!(username.equals(username) && password.equals(password))){

soapexception soapexc = new soapexception("认证失败");

throw new fault(soapexc);

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://my.oschina.net/u/3335797/blog/1927794

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 springboot整合cxf发布webservice以及调用的方法 https://www.kuaiidc.com/111368.html

相关文章

发表评论
暂无评论