最后更新时间:2007-11-29 关键字: WebService
简单来说,我很弄不懂ws&wsdl的运行模式,我仔细阅读了一下webservice关于分布式应用的逻辑!我的理解很simple!wsdl以文本形式提供为各种机器语言提供调用平台!所以我理所当然的认为,从wsdl生成的Client可以为我下层的各种应用平台提供敏捷的分步式对象!但是我发现,我很难理解ws生成的Client!
例子一个:
Ant Task! 简单运行一个Wsgen!
xml 代码
- <?xml version="1.0" encoding="UTF-8"?>
- <project default="webs" >
-
- <property name="base" value="${user.home}\jars"></property>
-
- <path id="xfire">
- <fileset dir="${base}\apache\activeMq" includes="*.jar"></fileset>
- <fileset dir="${base}\apache\ant" includes="*.jar"></fileset>
- <fileset dir="${base}\apache\commons" includes="*.jar"></fileset>
- <fileset dir="${base}\apache\struts2" includes="*.jar"></fileset>
- <fileset dir="${base}\apache\tomcat" includes="*.jar"></fileset>
- <fileset dir="${base}\apache\xmlbeans" includes="*.jar"></fileset>
- <fileset dir="${base}\antlr" includes="*.jar"></fileset>
- <fileset dir="${base}\dom4j" includes="*.jar"></fileset>
- <fileset dir="${base}\j2ee" includes="*.jar"></fileset>
- <fileset dir="${base}\jaxen" includes="*.jar"></fileset>
- <fileset dir="${base}\jee-ws" includes="*.jar"></fileset>
- <fileset dir="${base}\jsr" includes="*.jar"></fileset>
- <fileset dir="${base}\sun\jaxb" includes="*.jar"></fileset>
- <fileset dir="${base}\sun\jta" includes="*.jar"></fileset>
- <fileset dir="${base}\sun\mail" includes="*.jar"></fileset>
- <fileset dir="${base}\servlet" includes="*.jar"></fileset>
- <fileset dir="${base}\jdom" includes="*.jar"></fileset>
- <fileset dir="${base}\jetty" includes="*.jar"></fileset>
- <fileset dir="${base}\wsdl" includes="*.jar"></fileset>
- <fileset dir="${base}\xfire\old" includes="*.jar"></fileset>
- </path>
-
- <target name="webs">
- <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask"
- classpathref="xfire" />
- <wsgen outputDirectory="src" wsdl="http://localhost:8191/TwosomeMode?wsdl" package="com.dztalk.client" overwrite="true" />
- </target>
- </project>
运行结果
java 代码
- [wsgen] com\dztalk\core\services\ObjectFactory.java
- [wsgen] com\dztalk\core\services\Send.java
- [wsgen] com\dztalk\core\services\SendResponse.java
- [wsgen] com\dztalk\core\services\Trive.java
- [wsgen] com\dztalk\core\services\TriveAll.java
- [wsgen] com\dztalk\core\services\TriveAllResponse.java
- [wsgen] com\dztalk\core\services\TriveResponse.java
- [wsgen] com\dztalk\core\services\package-info.java
- [wsgen] com\dztalk\client\JMSException.java
- [wsgen] com\dztalk\client\TwosomeModeClient.java
- [wsgen] com\dztalk\client\TwosomeModeImpl.java
- [wsgen] com\dztalk\client\TwosomeModePortType.java
- [wsgen] javax\jms\ArrayOfMessage.java
- [wsgen] javax\jms\Destination.java
- [wsgen] javax\jms\JMSException.java
- [wsgen] javax\jms\Message.java
- [wsgen] javax\jms\ObjectFactory.java
- [wsgen] javax\jms\package-info.java
- [wsgen] java\util\Enumeration.java
- [wsgen] java\util\ObjectFactory.java
- [wsgen] java\util\package-info.java
- [wsgen] com\dztalk\core\pojo\roles\DzUser.java
- [wsgen] com\dztalk\core\pojo\roles\ObjectFactory.java
- [wsgen] com\dztalk\core\pojo\roles\package-info.java
- [wsgen] java\lang\Exception.java
- [wsgen] java\lang\ObjectFactory.java
- [wsgen] java\lang\package-info.java
为什么生成的代码不能直接使用
缺少类支持这个原因我是能理解的,但是很明显,wsgen还生成了JDK的原生类,这样我的Client在reference类的时候会去引用$myproject/src/java.lang.Exception ...这样的类!而这样我的code根本编译不过去!我在Xfire的MailList等了1个星期,没有任何人回答这个问题!再这个星期我尝试手动写XFire Client Code,是可以正常运行的!但是手动编Code肯定不是我的最终目的,我又尝试修改wsdl,同样可以!但是这和手写Client道理一样需要人工介入!
为什么要生成原生类
这是个让我很懵懂的地方,为什么要生成原生类?Client运行在自己的容器中,自然有本身的类库支持!而且我手写的Client根本不要写原生类,那为什么从wsdl生成的就要出现!我觉得这才是关键!我根本弄不懂!
我的code!
java 代码
- public Object getEndpoint(Endpoint endpoint) {
- try {
- return proxyFactory.create((endpoint).getBinding(), (endpoint).getUrl());
- } catch (MalformedURLException e) {
- throw new XFireRuntimeException("Invalid URL", e);
- }
- }
-
- public Object getEndpoint(QName name) {
- Endpoint endpoint = ((Endpoint) endpoints.get((name)));
- if ((endpoint) == null) {
- throw new IllegalStateException("No such endpoint!");
- }
- return getEndpoint((endpoint));
- }
出错的地方是
java 代码
error是 No Exception of type XFireRuntimeException can be thrown! An Exception type must be a subclass of thrownable!
java 代码
- throw new XFireRuntimeException("Invalid URL", e);
error依然是 No Exception of type XFireRuntimeException can be thrown! An Exception type must be a subclass of thrownable! 同时我认为这个函数也有问题!既然throw了一个e,为什么函数本身没有throw出去!难道ws的client不需要遵守java的编程规范!
java 代码
- throw new IllegalStateException("No such endpoint!");
error同上! 同样认为有语法问题存在!
希望能有高人点化一下我!我已经陷入了!找不到路了!