cxf-webService

本文详细介绍了如何使用CXF框架进行服务端Web Service开发,包括@webService、@WebMethod、@WebParam和@WebResult等注解的使用,以及maven配置、接口与实现类的创建、实体对象的定义、web.xml与Spring配置,最后讲解了如何通过CXF自动生成客户端代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务端开发

webService注解

@webService

这个注解表明这个Java类是webService的实现类或者这个Java接口为webService的接口,这个注解有以下6个参数可以配置这个webService的定义
1、endpointInterface:定义服务抽象Web Service协定的服务端点接口的完整名称,如果注解通过endpointInterface属性引用某个SEI,那么还必须使用@webService注解来注解该SEI
2、name:默认的port名为”实现类名+Port”,binding名为”实现类名+PortBinding”,通过指定name的值来替换实现类的值
3、portName:可以完成替换默认Port名和binding名(portName+Binding)
4、targetNamespace:指定targerNamespace值,默认值为http://包名/,通过这可以自定义一个targetNamespace值
5:serviceName:当映射到WSDL1.1时,此名称被用作wsdl:service的名称和wsdl:definitions的名称
6、wsdlLocation指向一个预定义的wsdl文件,代替自动生成的wsdl文件

@WebMethod

表示作为一项web Service操作的方法应用客户机或服务器服务端点接口(SEI)上的方法,或者应用于 JavaBeans 端点的服务器端点实现类。
需要在使用了@WebService注解的类中使用
1、operationName:指定与此方法相匹配的wsdl:operation 的名称。缺省值为 Java 方法的名称。(字符串)
2、action:定义此操作的行为。对于 SOAP 绑定,此值将确定 SOAPAction 头的值。缺省值为 Java 方法的名称。(字符串)
3、exclude:指定是否从 Web Service 中排除某一方法。缺省值为 false。(布尔值)

@WebParam

用于定制从单个参数至 Web Service 消息部件和 XML 元素的映射
1、name :参数的名称。如果操作是远程过程调用(RPC)类型并且未指定partName 属性,那么这是用于表示参数的 wsdl:part 属性的名称。
如果操作是文档类型或者参数映射至某个头,那么 -name 是用于表示该参数的 XML 元素的局部名称。如果操作是文档类型、
参数类型为 BARE 并且方式为 OUT 或 INOUT,那么必须指定此属性。(字符串)
2、partName:定义用于表示此参数的 wsdl:part属性的名称。仅当操作类型为 RPC 或者操作是文档类型并且参数类型为BARE 时才使用此参数。(字符串)
3、targetNamespace:指定参数的 XML 元素的 XML 名称空间。当属性映射至 XML 元素时,仅应用于文档绑定。缺省值为 Web Service 的 targetNamespace。(字符串)
4、mode:此值表示此方法的参数流的方向。有效值为 IN、INOUT 和 OUT。(字符串)
5、header:指定参数是在消息头还是消息体中。缺省值为 false。(布尔值)

@WebResult

注释用于定制从返回值至 WSDL 部件或 XML 元素的映射。将此注释应用于客户机或服务器服务端点接口(SEI)上的方法,或者应用于 JavaBeans 端点的服务器端点实现类。
1、name:当返回值列示在 WSDL 文件中并且在连接上的消息中找到该返回值时,指定该返回值的名称。对于 RPC 绑定,这是用于表示返回值的 wsdl:part属性的名称。对于文档绑定,-name参数是用于表示返回值的 XML 元素的局部名。对于 RPC 和 DOCUMENT/WRAPPED 绑定,缺省值为 return。对于 DOCUMENT/BARE 绑定,缺省值为方法名 + Response。(字符串)
2、targetNamespace:指定返回值的 XML 名称空间。仅当操作类型为 RPC 或者操作是文档类型并且参数类型为 BARE 时才使用此参数。(字符串)
3、header:指定头中是否附带结果。缺省值为false。(布尔值)
4、partName:指定 RPC 或 DOCUMENT/BARE 操作的结果的部件名称。缺省值为@WebResult.name。(字符串)

配置maven pom文件配置

添加以下依赖

 

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

 

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-api</artifactId>

<version>2.5.0</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-frontend-jaxws</artifactId>

<version>2.5.0</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-bindings-soap</artifactId>

<version>2.5.0</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-transports-http</artifactId>

<version>2.5.0</version>

</dependency>

<dependency>

<groupId>org.apache.cxf</groupId>

<artifactId>cxf-rt-ws-security</artifactId>

<version>2.5.0</version>

</dependency>

 

添加以下build

 

1

2

3

 

<build>

<finalName>cfxWSServer</finalName>

</build>

 

webService接口

在接口上加@WebService注解,并导入相应的包

 

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

 

package com.demo.hello.server;

import java.util.List;

import javax.jws.WebParam;

import javax.jws.WebService;

import javax.jws.soap.SOAPBinding;

import javax.jws.soap.SOAPBinding.Style;

import com.demo.hello.entry.People;

import com.demo.hello.entry.User;

import com.demo.hello.entry.Users;

@WebService

public interface Greeting {

/**

* @WevParam注解不加也可以

* @param userName

* @return

*/

String sayHi(@WebParam(name="username")String userName);

String sayHi2(@WebParam(name="username")String userName);

String[] sayHello(String[] userName);

public String sayToPeople(People people);

public String greeting(User user);

/**

* 传输List对象

* @param userl

* @return

*/

public List sayToList(List<User> userl);

/**

* 传输复杂对象需要用类包装

* @param users

* @return

*/

public Users sayToList2(Users users);

}

 

webService实现类

实现类同样需要添加@WebService注解

 

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

57

 

package com.demo.hello.server;

import java.util.List;

import javax.jws.WebService;

import com.demo.hello.entry.People;

import com.demo.hello.entry.User;

import com.demo.hello.entry.Users;

@WebService

public class GeetingImpl implements Greeting {

public String sayHi(String userName) {

return "Hello"+userName;

}

public String sayHi2(String userName) {

return "Hello"+userName;

}

@Override

public String[] sayHello(String[] userName) {

return userName;

}

public String greeting(User user) {

return "123";

}

@Override

public List sayToList(List<User> userl) {

String[] users = new String[userl.size()];

int i = 0;

for (User user : userl) {

users[i] = user.getName();

i++;

}

return userl;

}

@Override

public Users sayToList2(Users users) {

return users;

}

@Override

public String sayToPeople(People people) {

return "people";

}

}

 

实体对象

传输User以及People的对象
User

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 

package com.demo.hello.entry;

import java.io.Serializable;

public class User implements Serializable {

private static final long serialVersionUID = 1L;

private String name;

private String sex;

//get与set方法

}

 

People:

 

1

2

3

4

5

6

7

8

 

package com.demo.hello.entry;

public class People {

private String name;

private String age;

//get与set方法

}

 

Users类用来包装复杂对象

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

 

package com.demo.hello.entry;

import java.util.ArrayList;

public class Users {

/**

* 直接使用具体的**List或者具体的**Map

*/

private ArrayList<ArrayList<User>> userlist;

/**

* 无参构造函数不能丢

*/

public Users(){};

public Users(ArrayList<ArrayList<User>> userlist) {

super();

this.userlist = userlist;

}

//get and set

}

 

web.xml配置

 

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

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5"

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<!-- 配置 Spring 配置文件的名称和位置 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/config/spring.xml</param-value>

</context-param>

<!-- 启动 IOC 容器的 ServletContextListener -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<!-- 配置字符集 -->

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<servlet>

<servlet-name>CXFServlet</servlet-name>

<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>CXFServlet</servlet-name>

<!--==这个设置很重要,那么我们的webservice的地址就是http://localhost:8080/yourProgramName/webservice/Greeting=== -->

<url-pattern>/webservice/*</url-pattern>

</servlet-mapping>

<display-name>hello world!</display-name>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

</web-app>

Spring配置

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://cxf.apache.org/jaxws

http://cxf.apache.org/schemas/jaxws.xsd">

<!--=============== 实现类的bean,需要spring注入 ============================-->

<!-- 需要到达实现类 -->

<bean id="greetingImpl" class="com.demo.hello.server.GeetingImpl"/>

<jaxws:endpoint id="greeting" implementor="#greetingImpl" address="/Greeting" />

</beans>

启动服务,验证

访问http://localhost:8080/项目名/webservice/Greeting?wsdl
出现wsdl.xml文件则成功。

使用cxf自动生成客户端

环境变量配置

右键此电脑——>高级系统设置——>环境变量
在系统变量
在path中添加…/cxf/bin的路径

生成客户端代码命令

wsdl2java -d 客户端代码存放地址 -encoding utf-8 -client wsdl的地址,例如(http://localhost:8080/项目名/webservice/Greeting?wsdl)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值