加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Simple Frontend+Aegis方式发布并获取webservice

发布时间:2020-12-17 00:01:46 所属栏目:安全 来源:网络整理
导读:有时并不想用注释类或使用 JAX-WS API.CXF 包含一个简单的 Frontend ,允许你把任何类发布成 web service 且不需要额外的工作。不需要在业务接口中设置具体的协议、 @Web Service 、 @Web Method , 仅仅需要创建与具体 webservice 技术无关的业务接口就可以

有时并不想用注释类或使用JAX-WS API.CXF包含一个简单的Frontend,允许你把任何类发布成web service且不需要额外的工作。不需要在业务接口中设置具体的协议、@Web Service@Web Method仅仅需要创建与具体webservice技术无关的业务接口就可以了,?利用代理类进行发布服务和获取服务

一.简单实例

1.??编写业务接口和类:

public interface HelloWorld {

???????String sayHello(String text);

}

public class HelloWorldImpl implements HelloWorld {

??????????public String sayHello(String text) {

???????????????return "Hello " + text;

???????????}

?

2.??发布web service

import org.apache.cxf.frontend.ServerFactoryBean;

public class Server {

???????protected Server() throws Exception

????{

????????HelloWorldImpl helloworldImpl = new HelloWorldImpl();

????????ServerFactoryBean svrFactory = new ServerFactoryBean();

????????//设置服务接口

????????svrFactory.setServiceClass(HelloWorld.class);

????????svrFactory.setAddress("http://localhost:9000/Hello");

????????//设置服务实现接口类

????????svrFactory.setServiceBean(helloworldImpl);

????????//创建服务

????????svrFactory.create();

????}

????public static void main(String args[]) throws Exception {

????????new Server();

????????System.out.println("Server ready...");

????????Thread.sleep(5 * 60 * 1000);

????????System.out.println("Server exiting");

????????System.exit(0);

3.??测试?输入:http://localhost:9000/Hello?wsdl

4.??客户端:

需要创建与具体webservice技术无关的业务接口HelloWorld

5.??调用web service

import org.apache.cxf.frontend.ClientProxyFactoryBean;

/**

?*?客户端

?*?仅仅需要一个与具体技术无关的java接口HelloWorld

*/

public class Client {

????public static void main(String args[]) throws Exception

????????ClientProxyFactoryBean factory = new ClientProxyFactoryBean();?

????????//设置已发布服务接口

????????factory.setServiceClass(HelloWorld.class);

????????//为客户端代理bean?设置已经发布的服务地址

????????factory.setAddress("http://localhost:9000/Hello");?????

????????//获取已发布服务接口实例

????????HelloWorld client = (HelloWorld)factory.create();

????????System.out.println(client.sayHello("Tom"));????

二.与spring集成

1.?????????发布的web service,如果与spring集成,只需要加一个配置文件就可以了:

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

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

xmlns:simple="http://cxf.apache.org/simple"

xmlns:soap="http://cxf.apache.org/bindings/soap"

xsi:schemaLocation="

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

http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd

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

?

??<simple:server?id="helloservice"?serviceClass="frontend.HelloWorld"address="/hello">

????<simple:serviceBean>

????????<bean?class="frontend.HelloWorldImpl"?/>

????</??</simple:server>

</beans>

发布到tomcat下即可,访问:http://localhost:8080/<web_project_name>/ws/hello?wsdl

wsweb.xml中配置的CXFServlet映射路径。

?

2.?????????配置客户端spring-client.xml

????xmlns:jaxws="http://cxf.apache.org/jaxws"

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

"frontendClient"?"frontend.HelloWorld"

???????factory-bean="frontendClientFactory"?factory-method="create"?/>

??????

"frontendClientFactory""org.apache.cxf.frontend.ClientProxyFactoryBean">

???????<property?name="serviceClass"?value="frontend.HelloWorld"?/>

"address"

???????????"http://localhost:9000/Hello"?/>

bean>

beans>

3.?????????测试

public class SpringTest {

????public static void main(String[] args) {

???????ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-client.xml");

???????HelloWorld client = (HelloWorld) ctx.getBean("frontendClient");

???????String result = client.sayHello("你好!");

???????System.out.println(result);

????}

}

三.采用Aegis数据绑定

如果采用simple frontend方式发布复杂的web service?有自定义数据,默认的情况是采用JAXB绑定,如果你不想用注释,那就用Aegis数据绑定。

Aegis是一个快速,基于STAXStreaming API for XML)的数据绑定,它能使采用代码优先方式发布web service的情况更简单。Aegis?支持接口,集合类(包括Map)和各种数据类型。

1、????编写复杂的业务接口和实现类

public interface HelloWorld {

????String sayHello(String text);

????String sayUserHello(User user);

????List<User> findUsers();

????Map<Integer,User> getMapUsers();

其实的和普通的java区别,不用写xmlAdapter,也不用注释。

2、????发布web service

只要在发布web service时加上:svrFactory.getServiceFactory().setDataBinding(new AegisDatabinding());

具体如下:

????protected Server() throws Exception

????{

????????HelloWorldImpl helloworldImpl = new HelloWorldImpl();

????????ServerFactoryBean svrFactory = new ServerFactoryBean();

????????//设置服务接口类

????????svrFactory.setServiceClass(HelloWorld.class);

????????svrFactory.setAddress("http://localhost:9000/Hello");

????????//设置服务实现接口类

????????svrFactory.setServiceBean(helloworldImpl);

????????//采用Aegis方式进行数据绑定

????????svrFactory.getServiceFactory().setDataBinding(new AegisDatabinding());

?

????????//创建服务

????????svrFactory.create();

3、????客户端

创建与具体webservice技术无关的业务接口,因为传递的是User接口,所以要在客户端加上

User?接口和UserImple

public interface User {

????String getPassword();

????String getUsername();

????void setUsername(String username);

????void setPassword(String password);

????void setUserId(Integer userId);

????Integer getUserId();

public class UserImpl implements User {

????private Integer userId;

????private String username;

????private String password;

????public Integer getUserId() {

???????return userId;

????public void setUserId(Integer userId) {

???????this.userId = userId;

????public String getPassword() {

???????return password;

????public void setPassword(String password) {

???????this.password = password;

????public String getUsername() {

???????return username;

????public void setUsername(String username) {

???????this.username = username;

????public UserImpl(String username,String password) {

???????super();

????public UserImpl() {

????public UserImpl(String username) {

????public UserImpl(Integer userId,String username,51)">??

4、????测试,调用web service.

其中最关键要加上:

factory.getServiceFactory().setDataBinding(new AegisDatabinding());

public class Client {

????public static void main(String args[]) throws Exception

????????ClientProxyFactoryBean factory = new ClientProxyFactoryBean();?

????????//设置已发布服务接口

????????factory.setServiceClass(HelloWorld.class);

????????//为客户端代理bean?设置已经发布的服务地址

????????factory.setAddress("http://localhost:9000/Hello");?

????????//采用Aegis数据绑定

????????factory.getServiceFactory().setDataBinding(new AegisDatabinding());

????????//获取已发布服务接口实例

????????HelloWorld client = (HelloWorld)factory.create();

????????System.out.println(client.sayHello("Tom"));

????????System.out.println(client.sayUserHello(new UserImpl("aaa2222222222","bbb")));

????????

????????List<User> list = client.findUsers();

???????Iterator<User> i = list.iterator();

???????while (i.hasNext()) {

???????????User u = i.next();

???????????System.out.println(u.getUsername());

???????}

???????System.out.println("--------------------");

???????Map<Integer,User> map = client.getMapUsers();

???????for (Integer e : map.keySet()) {

//?????????System.out.println(e);

???????????System.out.println(map.get(e).getUsername());

????????System.exit(0);

5、????spring集成:

服务器的spring-cxf.xml的配置文件中加上:<simple:dataBinding>部分。

simple:dataBinding>

"org.apache.cxf.aegis.databinding.AegisDatabinding"?/>

客户端的配置文件修改spring-client.xml如下:

"aegisBean"?"org.apache.cxf.aegis.databinding.AegisDatabinding"scope="prototype"/>

name?="dataBinding"??ref="aegisBean"/>

.后记

感觉采用这种方式(Frontend+Aegiis)发布和获取web service要比采用JAX-WS Annotated Services from Java+JAXB组合要简单一些.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读