JAX-WS/CXF

优质
小牛编辑
129浏览
2023-12-01

Apache CXF WebService

没有话说,享受沉默

showcase项目已演示了JAX-WS2.0 + CXF 的最重要特性, 其中客户端在测试用例里.

SOAP这个名字,本身就是个笑话,一点都不Simple。其他一些WS-*协议,包括安全,附件等都不再看好,因此SpringSide4.0没什么更新。

测试工具依然是SoapUI。

Tips

1. CXF自动生成的WSDL与WADL文件

web.xml里定义了/cxf/*都归CxfServelet管,所以,访问http://localhost:8080/showcase/cxf/ ,就能看到所有的WSDL与WADL.

2. 从WSDL生成Java 客户端代码

从wsdl生成java则见showcae的bin/wsdl2java.bat, 使用CXF的maven插件, 需要预先将wsdl 从http://localhost:8080/showcase/cxf/soap/accountservice?wsdl 保存到target/wsdl/accountservice.wsdl。

3. 既然是默认大于配置,为什么还要写些annotation

  • 所有传输对象加上了XMLType(name="xxx"),因为CXF默认在wsdl时将所有类的名字都首字母小写,如果拿着这个WSDL来生成代码,在其他语言的生成工具如windows .Net可能会生成出一些首字母小写的类出来。
  • 所有方法的参数都要加@WebParam, 是因为CXF默认只会反射出arg0这样的名称。
  • 为什么要有接口类。其实annotation全部写在实现类也可以,但接口类可以交给客户,而且在写测试用例时能用于客户端Proxy,因此还是需要。
  • 接口与接口实现类的Header中反复声明一些东西,是因为各自声明的是不一样的,见注释。比如如果在实现类不声明@WebService,wsdl会分开两个文件显示,不好。

4. 返回类命名

返回类不要命名为XXXResponse,因为WSDL里也会每个方法默认生成一个XXXXResponse的元素,会造成冲突,最好命名为XXXResult。

5. Target NameSpace

万一有同名的元素,用namesapce分开来,原意是很好的,对于有双向生成需求的Soap来说也是必须的。但如果没写好,在wsdl里充满各种namesapce声明非常烦人。最好的做法是统一定义唯一一个常量,然后在所有地方用了annotation的地方都添加namespace定义。

6. 打印输入输出的SOAP XML

CXF的文档有点out了,比如如果要转用slf4j,其实不需要特别的设置,jul-over-slf4j自己就会把java.util.loggging桥接过来,又比如,showcase演示了在server端打印xml,此时需要开启logger org.apache.cxf.services =INFO ,因为debug发现此时的logger名称是 "org.apache.cxf.services.AccountSoapService.AccountSoapServiceImpl"

资料

  • Book: \ Dec.2009