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

[翻译]CXF用户指南:一个简单的JAX-WS服务

发布时间:2020-12-17 01:15:22 所属栏目:安全 来源:网络整理
导读:转自:http://www.iteye.com/topic/745233 ?原文地址:http://cxf.apache.org/docs/a-simple-jax-ws-service.html 这个例子将通过编写JAX-WS来引导你开发第一个服务 设置构建 编写服务 发布服务 访问服务 同样在CXF发布包中的也可以找到hello_world_code_fir

转自:http://www.iteye.com/topic/745233

?原文地址:http://cxf.apache.org/docs/a-simple-jax-ws-service.html

这个例子将通过编写JAX-WS来引导你开发第一个服务

  1. 设置构建
  2. 编写服务
  3. 发布服务
  4. 访问服务
同样在CXF发布包中的也可以找到hello_world_code_first示例,注意:这个示例只有在CXF 2.0.1+的版本中!

设置构建

如果你使用Maven来构建你的工程,查看 这个页面
否则,打开你最喜爱的IDE,然后创建一个新的工程,我们首先要做的是将CXF依赖的包添加到工程里,你可以在CXF的发布包的ib目录下找到这些依赖包(提示:如果发布包的版本改变,这些jar包上的版本数字可能有所不同)
引用
commons-logging-1.1.1.jar
geronimo-activation_1.1_spec-1.0.2.jar (or Sun's Activation jar)
geronimo-annotation_1.0_spec-1.1.1.jar (JSR 250)
geronimo-javamail_1.4_spec-1.6.jar (or Sun's JavaMail jar)
geronimo-servlet_2.5_spec-1.2.jar (or Sun's Servlet jar)
geronimo-ws-metadata_2.0_spec-1.1.2.jar (JSR 181)
geronimo-jaxws_2.1_spec-1.0.jar (or Sun's jaxws-api-2.1.jar)
geronimo-stax-api_1.0_spec-1.0.1.jar (or other stax-api jar)
jaxb-api-2.1.jar
jaxb-impl-2.1.12.jar
jetty-6.1.21.jar
jetty-util-6.1.21.jar
neethi-2.0.4.jar
saaj-api-1.3.jar
saaj-impl-1.3.2.jar
wsdl4j-1.6.2.jar
wstx-asl-3.2.8.jar
XmlSchema-1.4.5.jar
xml-resolver-1.2.jar

Spring依赖包 (非必须- 为了支持XML配置):
引用
aopalliance-1.0.jar
spring-core-2.5.5.jar
spring-beans-2.5.5.jar
spring-context-2.5.5.jar
spring-web-2.5.5.jar

还需要CXF的jar包:
引用
cxf-2.2.3.jar

编写服务

首先,我们将编写服务的接口,这个接口只有一个"sayHello" 的方法,这个方法会对提交他们名字的用户说 "Hello"
Java代码

?

  1. @WebService??
  2. public?interface?HelloWorld?{ ??
  3. ??
  4. ????String?sayHi(String?text); ??
  5. ??
  6. ????/*?进阶应用,JAX-WS/JAXB不支持自定义类型参数如User ?
  7. ?????*?需要编写XmlAdapter类来处理自定义类型 ?
  8. ?????*/??
  9. ????String?sayHiToUser(User?user); ??
  10. ??
  11. ????/*?Map传递 ?
  12. ?????*?JAXB同样也不支持Maps.处理Lists很轻松,但是不直接支持Maps ?
  13. ?????*?同样也需要使用XmlAdapter来映射maps到JAXB能处理的beans ?
  14. ?????*/??
  15. ????@XmlJavaTypeAdapter(IntegerUserMapAdapter.class) ??
  16. ????Map<Integer,?User>?getUsers(); ??
  17. }??
为了确认参数在xml文件中名称正确,你需要使用:
Java代码

?

  1. @WebService??
  2. public?interface?HelloWorld?{ ??
  3. ????String?sayHi(@WebParam(name="text")?String?text); ??
  4. }??
因为java接口在.class文件中不存储参数名称,所以@WebParam注解是必须的,因此如果你不使用这个注解,参数将被命名为arg0

我们的实现将像这样:
Java代码

?

  1. package?demo.hw.server; ??
  2. ??
  3. import?java.util.LinkedHashMap; ??
  4. import?java.util.Map; ??
  5. ??
  6. import?javax.jws.WebService; ??
  7. ??
  8. @WebService(endpointInterface?=?"demo.hw.server.HelloWorld",??
  9. ????????????serviceName?=?"HelloWorld") ??
  10. public?class?HelloWorldImpl?implements?HelloWorld?{ ??
  11. ????Map<Integer,?User>?users?=?new?LinkedHashMap<Integer,?User>(); ??
  12. ??
  13. ????public?String?sayHi(String?text)?{ ??
  14. ????????System.out.println("sayHi?called"); ??
  15. ????????return?"Hello?"?+?text; ??
  16. ????} ??
  17. ??
  18. ????public?String?sayHiToUser(User?user)?{ ??
  19. ????????System.out.println("sayHiToUser?called"); ??
  20. ????????users.put(users.size()?+?1,?user); ??
  21. ????????return?"Hello?"??+?user.getName(); ??
  22. ????} ??
  23. ??
  24. ????public?Map<Integer,?User>?getUsers()?{ ??
  25. ????????System.out.println("getUsers?called"); ??
  26. ????????return?users; ??
  27. ????} ??
  28. ??
  29. }??
在实现类上的@WebService注解使CXF知道使用那个接口来创建WSDL,我们示例中是HelloWorld接口

发布服务
Java代码

?

  1. System.out.println("Starting?Server"); ??
  2. HelloWorldImpl?implementor?=?new?HelloWorldImpl(); ??
  3. String?address?=?"http://localhost:9000/helloWorld"; ??
  4. Endpoint.publish(address,?implementor);??
完整的代码在 http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/java_first_jaxws/src/demo/hw/server/Server.java

或者你可以使用下列代码,通过如下代码,你可以更多控制行为,例如你可以添加日志拦截器
Java代码

?

  1. HelloWorldImpl?implementor?=?new?HelloWorldImpl(); ??
  2. JaxWsServerFactoryBean?svrFactory?=?new?JaxWsServerFactoryBean(); ??
  3. svrFactory.setServiceClass(HelloWorld.class); ??
  4. svrFactory.setAddress("http://localhost:9000/helloWorld"); ??
  5. svrFactory.setServiceBean(implementor); ??
  6. svrFactory.getInInterceptors().add(new?LoggingInInterceptor()); ??
  7. svrFactory.getOutInterceptors().add(new?LoggingOutInterceptor()); ??
  8. svrFactory.create();??
你可以忽略设置ServiceClass,但是最好设置,这样可以使服务端和客户端都从同样的接口创建而来,如果你使用实现类来作为替代可能会出现问题

浏览器里输入 http://localhost:9000/helloWorld?wsdl显示出这个服务的wsdl

访问服务

同样客户端代码在 http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/java_first_jaxws/src/demo/hw/client/Client.java

对于客户端,同样也有替代方法给予你更多的伸缩性,当然如上一个示例的日志拦截器也是可选择的,但是对于初学者帮助很大:
Java代码

?

  1. JaxWsProxyFactoryBean?factory?=?new?JaxWsProxyFactoryBean(); ??
  2. factory.getInInterceptors().add(new?LoggingInInterceptor()); ??
  3. factory.getOutInterceptors().add(new?LoggingOutInterceptor()); ??
  4. factory.setServiceClass(HelloWorld.class); ??
  5. factory.setAddress("http://localhost:9000/helloWorld"); ??
  6. HelloWorld?client?=?(HelloWorld)?factory.create(); ??
  7. ??
  8. String?reply?=?client.sayHi("HI"); ??
  9. System.out.println("Server?said:?"?+?reply); ??
  10. System.exit(0);???

(编辑:李大同)

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

    推荐文章
      热点阅读