调用WebService实例二,javaEE6 新Feature之wsimport工具
?
在javaEE6的bin文件夹时,有一个wsimport.exe,这个工具在5.0之前的版本里是没有的,这个工具依据wsdl文件生成相应的类文件,然后用这些类文件,就可以像调用本地的类一样调用WebService提供的方法了
?
The wsimport
tool generates JAX-WS portable artifacts,such as:
- Service Endpoint Interface (SEI)
- Service
- Exception class mapped from wsdl:fault (if any)
- Async Reponse Bean derived from response wsdl:message (if any)
- JAXB generated value types (mapped java classes from schema types)
These artifacts can be packaged in a WAR file with the WSDL and schema documents along with the endpoint implementation to be deployed. The generated Service class can be used to invoke the Web Service endpoint.
?
wsimport [options] <wsdl>
?
?
Option |
Description |
-d <directory> |
Specify where to place generated output files |
-b <path> |
Specify external JAX-WS or JAXB binding files (Each <file> must have its own -b ) |
-catalog
|
Specify catalog file to resolve external entity references,it supports TR9401,XCatalog,and OASIS XML Catalog format. Please read the XML Entity and URI Resolvers document or see wsimport_catalog sample. |
-extension |
allow vendor extensions (functionality not specified by the specification). Use of extensions may result in applications that are not portable or may not interoperate with other implementations |
-help |
Display help |
-httpproxy:<host>:<port> |
Specify an HTTP proxy server (port defaults to 8080) |
-keep |
Keep generated files |
-p |
Specifying a target package via this command-line option,overrides any wsdl and schema binding customization for package name and the default package name algorithm defined in the specification |
-s <directory> |
Specify where to place generated source files |
-verbose |
Output messages about what the compiler is doing |
-version |
Print version information |
-wsdllocation <location>
|
@WebService.wsdlLocation and @WebServiceClient.wsdlLocation value
|
?
?
?
首先,须保证你的jdk为6.0以上版本,可以在command line下试运行这个命令
c:/test> wsimport
?
假设我们有下面的wsdl文件
http://localhost:9080/WebService/TestService/TestService.wsdl
?
我们要把生成的代码放到c:/test/generate目录下,那么我们运行以下命令即可
?
c:/test> wsimport -s generate http://localhost:9080/WebService/TestService/TestService.wsdl
?
然后,你就会看到在c:/test/generate目录下生成了一些java代码文件,wsimport就是如此简单
?
?
假如我们要调用的WebService就是之前举例提到的TestService,它只有下面这样一个方法
?
- public?String?test(String?name)?throws?SOAPException ??
- { ??
-
?????if?(name?==?null) ??
- ????{ ??
-
????????throw?new?SOAPException("name?can't?be?null!"); ??
- ????} ??
- ???????? ??
-
????return?"hello?"?+?name;? ??
- }??
public String test(String name) throws SOAPException
{
if (name == null)
{
throw new SOAPException("name can't be null!");
}
return "hello " + name;
}
?
用wsimport工具,我们可以得到如下代码文件
?
generate
??? |--com
??????? |--company
??????????? |--ObjectFactory.java
??????????? |--SOAPException.java
??????????? |--SOAPException_Exception.java
??????????? |--Test.java
??????????? |--TestResponse.java
??????????? |--TestService.java
??????????? |--TestService_Service.java
??????????? |--package-info.java
?
把它们编译,然后写下面这样一个application去测试
?
?
- public?static?void?main(String[]?args) ??
- { ??
-
????TestService_Service?serviceFactory?=?new?TestService_Service(); ??
- ????TestService?service?=?serviceFactory.getTestServicePort(); ??
-
????try??
- ????{ ??
-
????????System.out.println(service.test(null)); ??
- ????} ??
-
????catch?(SOAPException_Exception?ex) ??
- ????{ ??
- ????????System.out.println(ex.getMessage()); ??
- ????} ??
- }??
public static void main(String[] args)
{
TestService_Service serviceFactory = new TestService_Service();
TestService service = serviceFactory.getTestServicePort();
try
{
System.out.println(service.test(null));
}
catch (SOAPException_Exception ex)
{
System.out.println(ex.getMessage());
}
}
?
运行它,屏幕就会输出
name can't be null
?
因为我们之前传了一个null值进去嘛,其实这也是为了测试SOAPException是否正常运行,如果你传个正确的字符串进去,webservice就可以正常运行,如System.out.println(service.test("javaeye"));,屏幕上就会显示,
Hello javaeye!
?
顺便提一下WebService的异常处理,所有WebService的异常都必须用SOAPException抛出,它是java.xml.soap包中的一个类 (本人试过其它一些Exception,都不能被正常捕捉,只有SOAPException可以正常工作,具体原因不明,如果有哪个人清楚这一点,请评论告之,谢谢)