随笔-126  评论-464  文章-0  trackbacks-0

本Blog所有内容不得随意转载,版权属于作者所有。如需转载请与作者联系( fastzch@163.com )。
未经许可的转载,本人保留一切法律权益。
一直以来,发现有某些人完全不尊重我的劳动成果,随意转载,提醒一下那些人小心哪天惹上官司。

网上关于XFire入门的教程不少,要么是讲得很简单,就像Hello World一样的程序,要么就是通过IDE集成的工具来开发的,这对于不同的人群有诸多不便,关于XFire的一些详细的信息就不再多讲,可以参考官方网站和相关的文档,这里讲一个完整的入门实例。

实例中包括三个情况,我想基本上可以概括所有的需求,或者自己稍加扩展即可。先来看看我们的Interface。

 1 package  test;
 2
 3 import  java.util.List;
 4
 5 public   interface  IHelloService  {
 6      public  String sayHello(String ttt);
 7     
 8      public  Course choose(User u);
 9     
10      public  List  test(List t);
11 }
这其中包含了简单对象的传递,对象的传递,List的传递。

具体的开发步骤如下:
1、定义Web Service的接口,代码见上面的接口定义。

2、实现接口和业务逻辑,代码如下:
 1package test;
 2
 3import java.util.ArrayList;
 4import java.util.List;
 5
 6public class HelloServiceImpl implements IHelloService {
 7
 8    public String sayHello(String ttt) {
 9        return "Hello, "+ttt;
10    }

11    
12    public Course choose(User u){
13        System.out.println(u.getName());
14        Course c=new Course();
15        c.setName("Eee");
16        return c; 
17        
18    }

19    
20    public List  test(List t){
21        for (int i = 0; i < t.size(); i++{
22            System.out.println((String) t.get(i));
23        }

24        List  al=new ArrayList();
25        Course c=new Course();
26        c.setName("EeeDDDDDD");
27        al.add(c);
28        return al;
29        
30    }

31}
用到的User和Course两个类的代码如下:
 1package test;
 2
 3public class User {
 4    private String name;
 5
 6    public String getName() {
 7        return name;
 8    }

 9
10    public void setName(String name) {
11        this.name = name;
12    }

13}

14
 1package test;
 2
 3public class Course  {
 4    private String name;
 5
 6    public String getName() {
 7        return name;
 8    }

 9
10    public void setName(String name) {
11        this.name = name;
12    }

13
14}

3、编写XFire要求的WebSevice定义描述文件,如下:
 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans xmlns="http://xfire.codehaus.org/config/1.0">
 3
 4    <service>
 5        <name>HelloService</name>
 6        <namespace>http://test/HelloService</namespace>
 7        <serviceClass>test.IHelloService</serviceClass>
 8        <implementationClass>test.HelloServiceImpl</implementationClass>
 9    </service>
10    
11</beans>
此文件放在src/META-INF/xfire/services.xml,编译时会自动编译到classes的相应目录下面。

4、因为我们用到了List等集合类型,所以需要定义Mapping关系,文件名为:src/test/IHelloService.aegis.xml,代码如下:
1<?xml version="1.0" encoding="UTF-8"?>
2<mappings>
3    <mapping>
4        <method name="test">
5            <parameter index="0" componentType="java.lang.String" />
6            <return-type componentType="test.Course" />
7        </method>
8    </mapping>
9</mappings>
请注意,此文件一定要放到与IHelloService.java相同的目录下面,否则会出错。

5、在Web.xml中配置XFire需要用到的Servlet,代码如下:
 1<?xml version="1.0" encoding="UTF-8"?>
 2<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 3    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
 5    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 6
 7    <servlet>
 8        <servlet-name>XFireServlet</servlet-name>
 9        <servlet-class>
10            org.codehaus.xfire.transport.http.XFireConfigurableServlet
11        </servlet-class>
12    </servlet>
13
14    <servlet-mapping>
15        <servlet-name>XFireServlet</servlet-name>
16        <url-pattern>/servlet/XFireServlet/*</url-pattern>
17    </servlet-mapping>
18
19    <servlet-mapping>
20        <servlet-name>XFireServlet</servlet-name>
21        <url-pattern>/services/*</url-pattern>
22    </servlet-mapping>
23
24
25    <welcome-file-list>
26        <welcome-file>index.jsp</welcome-file>
27    </welcome-file-list>
28</web-app>


此时Web Service的服务端就开发完成了。
我们来看看客户端的代码吧,也很简单,如下:
 1package test;
 2
 3import java.net.MalformedURLException;
 4import java.util.ArrayList;
 5import java.util.List;
 6
 7import org.codehaus.xfire.XFireFactory;
 8import org.codehaus.xfire.client.XFireProxyFactory;
 9import org.codehaus.xfire.service.Service;
10import org.codehaus.xfire.service.binding.ObjectServiceFactory;
11
12public class Client {
13
14    public static void main(String[] args) {
15
16        Service srvcModel = new ObjectServiceFactory()
17                .create(IHelloService.class);
18        XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
19                .newInstance().getXFire());
20
21        String helloWorldURL = "http://localhost:8080/xfiretest/services/HelloService";
22        try {
23            IHelloService srvc = (IHelloService) factory.create(srvcModel,
24                    helloWorldURL);
25            System.out.println(srvc.sayHello("Robin"));
26            
27            User u=new User();
28            u.setName("RRRRR");
29            Course c=srvc.choose(u);
30            System.out.println(c.getName());
31            
32            List  al=new ArrayList();
33            al.add("1212");
34            al.add("2222");
35            List t=srvc.test(al);
36            for (int i = 0; i < t.size(); i++{
37                Course co=(Course)t.get(i);
38                System.out.println(co.getName());
39            }

40            
41            
42        }
 catch (MalformedURLException e) {
43            e.printStackTrace();
44        }

45
46    }

47
48}

49

以上代码均无注释,因为都非常简单,呵呵。如有不清楚的地方,请留言!


关于使用XFire开发Web Service客户端的方法,可以参考我的另一篇文章《使用XFire开发Web Service客户端完整入门教程》。
posted on 2008-01-03 17:53 Robin's Java World 阅读(15984) 评论(73)  编辑  收藏 所属分类: Java

评论:
# re: XFire完整入门教程 2008-01-03 23:13 | star
沙发,先顶后看!  回复  更多评论
  
# re: XFire完整入门教程 2008-01-04 09:06 | Robin's Java World
@star
谢谢支持!  回复  更多评论
  
# re: XFire完整入门教程 2008-01-04 12:10 | BeanSoft
代码行号去掉就好了。不过个人觉得用IDE生成没什么不好,Java这么多乌七八糟的开源框架,没IDE那才叫疯了呢,生活是为了活得轻松嘛,要不然也不至于都用拖拉机耕地,还没见哪个人用手耕地。  回复  更多评论
  
# re: XFire完整入门教程 2008-01-04 17:12 | Robin's Java World
@BeanSoft
能生成的当然很好,不过用IDE生成的话,XFire开发WS需要JDK5支持,而我们的项目要求我们使用JDK1.4.2,没办法,我们不能用生成。
另外,代码生成往往会让我们忽视原理,我比较喜欢知其然,更知其所以然。

PS:以后贴代码的时候再不用行号了。谢谢提醒!  回复  更多评论
  
# re: XFire完整入门教程[未登录] 2008-01-09 09:24 | johnny
我先顶后看,希望楼主上面的代码,
不是cope不完整的代码
不然我会开骂的,o(∩_∩)o...哈哈  回复  更多评论
  
# re: XFire完整入门教程 2008-01-09 10:39 | 我爱百合
先回帖再看!
之前刚在IDE里开发过,正想怎么手工创建呢?呵呵,谢谢楼主了!
有问题来问哦!
  回复  更多评论
  
# re: XFire完整入门教程 2008-01-09 11:25 | 我爱百合
不出意料,报错了!!!
org.codehaus.xfire.XFireRuntimeException: Cannot create mapping for java.util.List, unspecified component .....

先提两个有疑问的地方:
第一、services.xml文件到底放在什么地方?我放在HelloWord/META-INF/xfire下了。
其中HelloWorld是我的工程名,xfire是我在META-INF下建的一个文件夹。
第二、IHelloService.aegis.xml文件名就叫这个吗?我把它放在test包下了,和IHelloService.java在一起
我哪里写错了?  回复  更多评论
  
# re: XFire完整入门教程[未登录] 2008-01-09 16:19 | johnny
@我爱百合
你的配置出问题了?
楼主上面的东东,好像少配置了一个东东。
我这里有一个我刚写好的一个程序,如果你需要的话,我可以发给你
:-) QQ:786875783  回复  更多评论
  
# re: XFire完整入门教程 2008-01-14 11:21 | netpirate
pls use MyEclipse!  回复  更多评论
  
# re: XFire完整入门教程 2008-01-17 22:39 | Robin's Java World
@我爱百合
services.xml文件放到哪里都可以,但是要保证编译后能够在Web工程的Classes目录的META-INF/xfire目录下。

IHelloService.aegis.xml文件放在与IHelloService.java相同的目录下即可。  回复  更多评论
  
# re: XFire完整入门教程 2008-01-19 15:59 | Robin's Java World
@netpirate
If I have not myeclipse, how work?
And Myeclipse have to use above JDK5.0 .  回复  更多评论
  
# re: XFire完整入门教程 2008-02-15 14:34 | cckey
那几个servlet呢。。。。  回复  更多评论
  
# re: XFire完整入门教程 2008-02-21 10:12 | huazxing@163.com
@我爱百合
Robin的例子是IHelloService.aegis.xml,如果你是HelloWorld,你的文件名可能是IHelloWorldService.aegis.xml或其他类似名称,请根据你的接口名称命名此文件。

另外,如果你用的是JDK1.5或以上,可以直接在List中加入具体类型,比如例子中的return type: List<Course>和parameter 0 :List<String>,这样就不用mapping了
具体可以参考XFire 最新生火指南(上):
http://wiki.springside.org.cn/display/springside/XFire
2.3 配置Java-XML Binding

@Robin
感谢楼主的完整讲解  回复  更多评论
  
# re: XFire完整入门教程 2008-02-23 23:55 | Robin's Java World
@huazxing@163.com
感谢你的热情回答!
  回复  更多评论
  
# re: XFire完整入门教程 2008-02-28 11:01 | milo
请问下面的异常是由什么到导致的。

- No beans defined in application context [org.codehaus.xfire.transport.http.XFireConfigurableServlet$GenericWebApplicationContextX;hashCode=2254042]
- Commons Collections 3.x available
- Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@1586cbd]
- Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@15ad1da]
- Unable to locate ThemeSource with name 'themeSource': using default [org.springframework.ui.context.support.ResourceBundleThemeSource@18bbb61]
- Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans []; root of BeanFactory hierarchy]
- Error initializing XFireServlet.
java.lang.SecurityException: class "org.springframework.core.AttributeAccessorSupport"'s signer information does not match signer information of other classes in the same package
at java.lang.ClassLoader.checkCerts(ClassLoader.java:775)
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:487)
at java.lang.ClassLoader.defineClass(ClassLoader.java:614)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1812)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:866)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1319)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1198)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.apache.xbean.spring.context.impl.XBeanHelper.createBeanDefinitionReader(XBeanHelper.java:36)
at org.codehaus.xfire.spring.XFireConfigLoader.getXFireApplicationContext(XFireConfigLoader.java:74)
at org.codehaus.xfire.spring.XFireConfigLoader.loadContext(XFireConfigLoader.java:41)
at org.codehaus.xfire.transport.http.XFireConfigurableServlet.loadConfig(XFireConfigurableServlet.java:86)
at org.codehaus.xfire.transport.http.XFireConfigurableServlet.createXFire(XFireConfigurableServlet.java:54)
at org.codehaus.xfire.transport.http.XFireServlet.init(XFireServlet.java:45)
at javax.servlet.GenericServlet.init(GenericServlet.java:211)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1105)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:932)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3917)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4201)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:904)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:867)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
at org.apache.catalina.core.StandardService.start(StandardService.java:450)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:709)
at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
  回复  更多评论
  
# re: XFire完整入门教程 2008-02-28 16:36 | Robin's Java World
@milo
你是不是做了Spring的整合?
No beans defined in application context
根据这句的提示,应该是说你用到了某一个bean,但是并没有在Spring中定义。
  回复  更多评论
  
# re: XFire完整入门教程 2008-02-28 18:23 | milo
我应该没有使用到Spring,我开始怀疑XFire的库和其他的库有冲突,于是我就把我没用到的库都删掉了,可是异常更多了。  回复  更多评论
  
# re: XFire完整入门教程 2008-02-28 22:18 | milo
robin谢谢了。问题已经解决,是第三方的jar有冲突了:dom4j中的jaxen与XFire中的jaxen包冲突了!  回复  更多评论
  
# re: XFire完整入门教程 2008-03-06 17:12 | passenger
webservice 一定要开发一个客户端程序吗?如果这样,则需在每个客户机上安装一个客户程序岂不很麻烦?  回复  更多评论
  
# re: XFire完整入门教程 2008-03-19 14:38 | Robin's Java World
@passenger
不好意思,说句不太客气的话,你可能需要更多应用软件架构与部署的更多知识,也需要更好的理解C/S,B/S的更多相关知识。
通常,是否需要在客户机上装一个客户程序是取决于你是用C/S还是用B/S模式的。当然,你也可以把任何与Web Service交互的机器当作是客户端,这样的话,那就是每个机器上都要装客户端程序了。  回复  更多评论
  
# re: XFire完整入门教程 2008-03-23 22:51 | yame
我完全按照上面的完整教程做下来,服务器端部署服务都正常,客房歒代码运行出现如下错误,请问这是什么原因?
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/httpclient/Credentials
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getConstructor(Unknown Source)
at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:108)
at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
at org.codehaus.xfire.client.Client.invoke(Client.java:336)
at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
at $Proxy0.sayHello(Unknown Source)
at client.Client.main(Client.java:25)  回复  更多评论
  
# re: XFire完整入门教程 2008-03-24 01:55 | Robin's Java World
@yame
根据你贴上来的Log来看,是属于没有找到Credentials这个类所致。
通常出现这样的错误有两种情况:
1,没有依赖的包,或者包不在classpath下
2,包冲突
请根据具体情况来判断,检查环境配置是否正确。  回复  更多评论
  
# re: XFire完整入门教程[未登录] 2008-03-24 08:57 | zym
使用xfire做webservice,在浏览器中可以访问到wsdl,用MyEclipse的Web Service Explore 调用服务出现如下错误,请教大概是什么原因导致的?
[ERROR] http-8888-Processor24 2008-03-24 08:55:02,062 org.codehaus.xfire.handler.DefaultFaultHandler - Fault occurred!
java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.xfire.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:54)
at org.codehaus.xfire.service.invoker.ObjectInvoker.invoke(ObjectInvoker.java:45)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler.sendMessage(ServiceInvocationHandler.java:271)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler$1.run(ServiceInvocationHandler.java:84)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler.execute(ServiceInvocationHandler.java:132)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:107)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)
at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)
at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:301)
at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:130)
at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)  回复  更多评论
  
# re: XFire完整入门教程 2008-03-24 17:13 | wudayin
xfire生成的服务默认是不是使用SOAP1.1报文?
如何配置才能让xfire生成的服务使用SOAP1.2报文的设置内容?  回复  更多评论
  
# re: XFire完整入门教程 2008-03-30 16:23 | Robin's Java World
@wudayin
xfire默认是采用SOAP1.1的报文。
如果你想使用SOAP1.2的报文的话,可以采用bindings标签来进行设置。
也可以与Spring结合来进行配置,相关的配置你可以参考官方文档。  回复  更多评论
  
# re: XFire完整入门教程 2008-03-30 16:24 | Robin's Java World
@zym
出现你这样问题的原因应该是包的配置不对,或者是程序中有哪里没有按文章中所说的来。怀疑是你客户端所传对象不正确之类。  回复  更多评论
  
# re: XFire完整入门教程 2008-07-22 16:47 | ponpon
你好,我是用MyEclipse来开发的,请问用webservice怎么样从客户端传递List参数给服务器端吗(在另外一个JavaProject工程里面)?
比如我在服务器上的函数是public String getList(List list){},其中这List装的对象是User对象,我用MyEclipse生成客户端时自动生成了一个ArrayOfUser类,调用service.getList(),时里面提示要的参数不是List型,而是ArrayOfUser型 ,该怎么封装一下呢?谢谢
望回信:javapon@163.com  回复  更多评论
  
# re: XFire完整入门教程 2008-07-23 15:17 | Robin's Java World
@ponpon
在另一个工程里面要传List<User>这样的参数,你可以把服务端的User对象打包过来。然后import这个对象即可呀。  回复  更多评论
  
# re: XFire完整入门教程 2008-07-30 23:26 | young
蛮不错的文章.对于像我们这样初学WEB SERVICES的.
有2个疑问请教一下:
1.像客户端的话明显是不知道User和Course结构的,一般的做法是怎么样让客户端去知道User和Course结构的?

2.如果Course或User也是要调用服务端进行实现的话,又该如何处理?  回复  更多评论
  
# re: XFire完整入门教程 2008-07-31 15:48 | Robin's Java World
@young
回答你的两个问题:
1,客户端很明显是可以通过WSDL来知道User,Course等对象的结构的。比如,你用一些工具来生成客户端时,可以自动生成这些对象。
2,Course,User等对象客户端有定义,所以不存在你说的问题。  回复  更多评论
  
# re: XFire完整入门教程 2008-08-15 17:27 | gulu
我按照robin的方法,服务端正常可以显示wsdl
但客户端执行结果:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.httpclient.params.HttpConnectionManagerParams.setDefaultMaxConnectionsPerHost(I)V
at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.createClient(CommonsHttpMessageSender.java:230)
at org.codehaus.xfire.transport.http.CommonsHttpMessageSender.open(CommonsHttpMessageSender.java:129)
at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:121)
at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
at org.codehaus.xfire.client.Client.invoke(Client.java:336)
at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77
)
at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
at $Proxy0.echoHello(Unknown Source)
at test.main(test.java:27)
  回复  更多评论
  
# re: XFire完整入门教程[未登录] 2008-08-21 11:07 | rain
这个官的太好了,我找了一本书对着做,总是做不出来,但是看了你的明白是什么意思了,谢谢您的提供啊!!!  回复  更多评论
  
# re: XFire完整入门教程 2008-08-21 22:33 | Robin's Java World
@rain
不客气,能帮上你我就觉得很高兴了。  回复  更多评论
  
# re: XFire完整入门教程 2008-08-22 16:32 | MM
太谢谢了  回复  更多评论
  
# re: XFire完整入门教程 2008-08-22 16:35 | MM
先看看,再研究CXF
呵呵  回复  更多评论
  
# re: XFire完整入门教程 2008-08-26 18:41 | Robin's Java World
@MM
不客气。
XFire与CXF实际上还是存在不少差异的。  回复  更多评论
  
# re: XFire完整入门教程 2008-09-03 11:30 | syzdcs
感谢,很受用.楼主能不能再加上一个返回文件的例子啊  回复  更多评论
  
# re: XFire完整入门教程 2008-09-05 11:24 | Robin's Java World
@syzdcs
不客气。返回文件的例子是什么意思呀?能不能把你的需求说详细点?  回复  更多评论
  
# re: XFire完整入门教程 2008-09-10 16:32 | Hilly
3个疑问:
a.IHelloService.aegis.xml这个文件放好了,不需要在哪里配置这是谁的配置文件吗?
b.我的客户端是另一个项目的C/S架构的,我要准备服务器端同样的接口吗?就是说客户端和服务器端都要有IHelloService.java文件,是吗?
c.客户端和服务器端都要有User和Couser类吗?我都有了,可是传过去的和返回的都是没有赋值的,System.out.println(c.getName());
System.out.println(u.getName());输出都是null,但c和u不是null。
是什么问题呢?谢谢1  回复  更多评论
  
# re: XFire完整入门教程 2008-09-11 15:14 | Robin's Java World
@Hilly
a,不需要。
b,请问你CS架构的客户端是采用什么语言开发的?至于是否需要接口,你可以看我的另一篇专门讲开发客户端的文章,地址为:http://www.blogjava.net/fastzch/archive/2008/08/28/225439.html
c,目前不清楚你客户端的实现,所以不好具体定位。要看你的客户端使用什么框架,很有可能是因为Style和use两个属性的不匹配引起的值为空。  回复  更多评论
  
# re: XFire完整入门教程 2008-09-12 14:11 | Hilly
@Robin's Java World
谢谢你这么快就回复了。
关于b,我是用java.
关于c,客户端我简化到只有main 函数的类,也还是问题依旧。我不知道你说的Style和use是哪里的两个属性,还是笔误。

在回复上面几行之前,我再次用2个新项目做了测试, 终于通过了,我的错误在于2个项目中User和Course的包结构不一样,比如一个项目用com.anzhixin.bean.User,另一个项目用test.User,就会出现我这种问题。难道不同项目之间的bean要搞同样的包结构吗,真的太让人疯了?只帮我确认这个问题就可以了。  回复  更多评论
  
# re: XFire完整入门教程 2008-09-12 14:52 | Robin's Java World
@Hilly
b,用Java开发,假如你也有XFire实现的话,可以看我的相关的文章,地址上面已经给你了。如果用其它的框架,可以参考相关的文件。
c,关于Style和use的使用,我想你可能需要了解一下Web Service的基础,我就曾经在用CXF开发的客户端调用XFire开发的服务端时,发生过因Style使用的问题而无法传递参数。Style分为RPC和Document两种,决定了调用的方式,use分为Literal和Encode两种,决定了内容的编码方式更多的内容可以参考SOAP规范等资料。

关于包结构的问题,实际上并不存在这样的问题,你可以根据自己的需要来命名包,只要对象的属性相同即可。  回复  更多评论
  
# re: XFire完整入门教程 2008-10-14 11:18 | 狮子
@Robin's Java World
麻烦请教个问题:
你在客户端程序的 17 行 有 IHelloService.class
请问 这个 IHelloService 这个类是从那里来的呢?wsdl 生成的客户端类里我找不到这类,请多多指教 谢谢  回复  更多评论
  
# re: XFire完整入门教程 2008-10-14 11:46 | Robin's Java World
@狮子
IHelloService 就是文章中讲的第一个interface。
如果你在一个新的工程里,可以把这个文件Copy过去,也可以用其它的方式根据WSDL生成这个Class。
具体的Client的开发,可以参考我的另一篇文章,那里面有详细的描述。地址为:
http://www.blogjava.net/fastzch/archive/2008/08/28/225439.html   回复  更多评论
  
# re: XFire完整入门教程 2008-10-16 15:13 | perry1103
这样配置services.xml会有问题,路径不对
应该是:在项目的WebContent/ META-INF目录下面新建一个xfire文件夹,把services.xml文件放到这个新建文件夹里。最后再把META-INF文件夹整个移到WebContent/ WEB-INF目录下  回复  更多评论
  
# re: XFire完整入门教程 2008-11-19 09:13 | dreadbird
谢谢楼主!很有研究精神
想问一个问题:所创建的类:User和Course 是放在服务器端的,在客户端代码中同样,你new了两个对象,请问,你在new对象的时候,如何获得该类路径?难道在客户端也必须要创建这两个bean?  回复  更多评论
  
# re: XFire完整入门教程[未登录] 2008-12-09 11:26 | aa
靠还法律责任,真把自己当小白菜了!要给杨乃伍打官司!
好像有点把自己看的太高了!  回复  更多评论
  
# re: XFire完整入门教程 2008-12-12 13:58 | ring
web.xml,services.xml都配置过了,
但是有报错:
Servlet XFireServlet is not available
急盼答案......

  回复  更多评论
  
# re: XFire完整入门教程 2008-12-26 20:53 | Yvon
总结的很好,谢谢啦,不知道博主有没有讲CFX的介绍,期待  回复  更多评论
  
# re: XFire完整入门教程 2008-12-29 12:11 | Robin's Java World
@ring
是不是没有正确的配置lib?
@Yvon
不客气,有此想法,敬请期待!  回复  更多评论
  
# 客户端自定义对象传String可以,为什么传Int型和boolean类型不行 2009-01-14 09:56 | ZLZ
客户端自定义对象传String可以,为什么传Int型和boolean类型不行!楼主帮我下,问题解决请将答案发至zlz811106@163.com,万分感谢  回复  更多评论
  
# re: XFire完整入门教程 2009-01-15 16:36 | 完全不懂XFIRE
在开发服务端的过程中,实体类和接口和实现在不同包结构下,此时生成的客户端传递复杂参数给服务端,服务端获得参数不为空,但是get属性的时候为null.如果实体类和接口,实现类放在同一个包中,则不出现此问题.

但是在实际的应用中实体类和接口类,实现类是在不同包结构中的,应该怎么解决?急盼楼主答复,谢谢.  回复  更多评论
  
# re: XFire完整入门教程 2009-01-15 16:41 | 完全不懂XFIRE
与 Hilly 所提出的C问题一样.经过确定是与包结构有关.如何保证实体类和接口类,实现类在同一个命名空间下?  回复  更多评论
  
# re: XFire完整入门教程 2009-03-07 21:53 | wqyang
所创建的类:User和Course 是放在服务器端的,在客户端代码中同样,你new了两个对象,请问,你在new对象的时候,如何获得该类路径?难道在客户端也必须要创建这两个bean?
这同样是我遇到的问题,如果是在跨平台的情况下,如何将WSDL中的参数结构映射到客户端,生成客户端相应的bean.是否有相应工具?
谢谢解答。  回复  更多评论
  
# re: XFire完整入门教程 2009-03-07 21:55 | wqyang
或者这样说,在服务端将他的服务开发好后,为了使所有客户端都可以调用本服务,在提供WSDL的情况下,还需要将所有用到的参数bean一起发布到Web Service Registry或UDDI吗?  回复  更多评论
  
# re: XFire完整入门教程 2009-03-08 03:08 | Robin's Java World
@wqyang
客户端当然也要这两个Class.
你可以参考我专门针对XFire写的客户端开发教程:
http://www.blogjava.net/fastzch/archive/2008/08/28/225439.html  回复  更多评论
  
# re: XFire完整入门教程 2009-03-13 16:13 | hfut_hfut
如果,我的数据类型定义在xsd文件中,那客户端怎么办呢???  回复  更多评论
  
# re: XFire完整入门教程 2009-03-17 22:41 | Robin's Java World
@hfut_hfut
可以根据XSD生成POJO。  回复  更多评论
  
# re: XFire完整入门教程 2009-03-19 14:47 | wumingshi
@Robin's Java World
你这里Client是和前面代码放在同一个包下,实际开发中肯定是分离不同的工程嘛
Client中出现了IHelloService,User,Course等未知类编译都通不过,咋整?  回复  更多评论
  
# re: XFire完整入门教程 2009-03-19 17:00 | Robin's Java World
@wumingshi
直接把类COPY过去就可以了。  回复  更多评论
  
# re: XFire完整入门教程 2009-03-31 16:10 | liang
楼主真是个热心人,我也从您的文章中受益匪浅。
想向您确认下,org.w3c.dom.Document类型是不需要写aegis映射文件的吧?
报错为
***************************
rg.codehaus.xfire.handler.DefaultFaultHandler invoke
严重: Fault occurred!
java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.xfire.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:59)
at org.codehaus.xfire.service.invoker.ObjectInvoker.invoke(ObjectInvoker.java:45)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler.sendMessage(ServiceInvocationHandler.java:320)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler$1.run(ServiceInvocationHandler.java:86)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler.execute(ServiceInvocationHandler.java:134)
at org.codehaus.xfire.service.binding.ServiceInvocationHandler.invoke(ServiceInvocationHandler.java:109)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)
at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)
at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:304)
at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:129)
at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
*********************************
可能是客户端传递参数有问题,但是又不能确定,因为客户端函数就只传递了一个String对象而已。  回复  更多评论
  
# re: XFire完整入门教程 2009-04-02 11:36 | sss
客户端跟Web Service的服务端写在同一个项目中,调用很容易。但是如果我要在另一个项目中调用Web Service的服务端,如果客户端还是写成Service srvcModel = new ObjectServiceFactory() .create(IHelloService.class);就报错了,原因是IHelloService.class不存在,因为不在同一个项目中。这个问题又如何解决呢?
  回复  更多评论
  
# re: XFire完整入门教程 2009-04-02 14:42 | Robin's Java World
@sss
另一个项目中直接把IHelloService这个类Copy过去就可以了。
关于使用XFire开发Web Service客户端的方法,可以参考我的另一篇文章《使用XFire开发Web Service客户端完整入门教程》。 见:
http://www.blogjava.net/fastzch/archive/2008/08/28/225439.html  回复  更多评论
  
# re: XFire完整入门教程 2009-04-02 14:43 | Robin's Java World
@liang
不用写Aegis配置文件,请检查一下你每一步是否正确。估计是你哪里配置有问题。  回复  更多评论
  
# re: XFire完整入门教程 2009-04-02 16:12 | sss
谢谢,我试试看。我的客户端是用xfire的插件创建的,能访问,但是我遇到了一个问题,就是我在服务器添加了一个方法是从数据库读数据的,然后返回一个list给客户端,在客户端读取这个list的值的时候,值不能正常显示,而是显示javax.xml.bind.JAXBElement@fb65cc这种形式的值。想了一整天了,还没想到怎么能让他正常显示。唉....  回复  更多评论
  
# re: XFire完整入门教程 2009-04-10 15:33 | @gong_max
@sss
使用getvalue方法.
你或者把自动生成的对象使用服务端的对象完全代替
  回复  更多评论
  
# re: XFire完整入门教程 2009-04-15 15:05 | 005
我也是新近学的wenservices,在ssh和xfire整合的时候总是报出这个错误,用eclipse生成web services client时检测服务无法启动,对应网页也打不开,但是我直接搭建webservices时没有对应错误,一切都正常,请问下时为什么,谢谢~
java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.XmlBeanDefinitionReader.setValidationMode(I)V
at org.apache.xbean.spring.context.v2.XBeanXmlBeanDefinitionReader.<init>(XBeanXmlBeanDefinitionReader.java:58)  回复  更多评论
  
# re: XFire完整入门教程 2009-04-17 01:54 | Robin's Java World
@005
可能是由于包的版本不太对的原因。
  回复  更多评论
  
# re: XFire完整入门教程 2009-04-17 09:21 | 005
@Robin's Java World
有没有spring与xfire结合的书或视频推荐下,3Q了。PS:springside网页上的例子连接怎么总是无法显示啊。  回复  更多评论
  
# re: XFire完整入门教程 2009-04-20 11:15 | 005
@Robin's Java World
恩,架包asm.jar和asm-2.2.3.jar有冲突,删除asm-2.2.3.jar后问题解决,搞了2天累的头发都少了不少,挣点钱不容易啊。  回复  更多评论
  
# re: XFire完整入门教程 2009-05-04 14:38 | GMC
大哥都需要导入什么jar啊?!! 这个比较关键吧.代码...在哪都能找到~~
javax.servlet.ServletException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xfire.typeMappingRegistry' defined in class path resource [org/codehaus/xfire/spring/xfire.xml]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: null


我总是报这个错误! 怎么解决啊?  回复  更多评论
  
# re: XFire完整入门教程 2009-05-31 13:55 | 分享爱的空间
能详细讲一下IHelloService.aegis.xml的配置文件中的对应关系式如何体现的?怎么看不出list对象。  回复  更多评论
  
# re: XFire完整入门教程 2009-07-01 16:46 | 方法
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
@GMC
@005
@005
不对啊  回复  更多评论
  


标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-09-01 00:56 编辑过