竹里馆→忆童年

独坐幽篁里,弹琴复长啸;深林人不知,明月来相照
posts - 9, comments - 23, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 ::  :: 管理

    终于,使用Java完成了一个WebService的例子,其中的一个非常小的问题,折腾了我将近一天的时间。下面给出步骤,说明在Java平台上如何开发WebService。

    采用的工具:Eclipse3.1.2 + Tomcat5.5 + XFire1.1 。使用XFire开发WebService应该说非常的容易,只需要按照下面例子的步骤来做:

(1)在Eclipse中新建一个dynamic Web Project ,假设名为XFireZhuweiTest。

(2)导入XFire用户库。该库中应包含xfire-1.1目录下的xfire-all-1.1.jar文件,以及xfire-1.1\lib目录下的所有文件。

(3)将上述的XFire用户库中的所有文件拷贝到XFireZhuweiTest项目的WebContent\WEB-INF\lib目录下。

(4)修改WebContent\WEB-INF\web.xml配置文件的内容,下面是修改后web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>
    XFireZhuweiTest</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    
    <servlet>
         <servlet-name>XFireServlet</servlet-name>
         <servlet-class>
                 org.codehaus.xfire.transport.http.XFireConfigurableServlet
         </servlet-class>
     </servlet>
     
     <servlet-mapping>
         <servlet-name>XFireServlet</servlet-name>
         <url-pattern>/servlet/XFireServlet/*</url-pattern>
     </servlet-mapping>
 
     <servlet-mapping>
         <servlet-name>XFireServlet</servlet-name>
          <url-pattern>/services/*</url-pattern>
     </servlet-mapping>
    
</web-app>

    web.xml中添加的servlet映射表明,所有匹配“/services/*”的url请求全部交给org.codehaus.xfire.transport.http.XFireConfigurableServlet来处理。

(5)编写需要发布为WebService的Java类,这个例子中是一个非常简单的MathService.java。

package com.zhuweisky.xfireDemo;
public class MathService 
{
    
public int Add(int a ,int b)
    {
        
return a+b ;
    }
}

(6)在WebContent\META-INF目录下新建xfire文件夹,然后在xfire目录下添加一个XFire使用的配置文件services.xml,该配置文件中的内容反映了要将哪些java类发布为web服务。本例中的services.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
    
<service>
      
<name>MathService</name>
      
<namespace>http://com.zhuweisky.xfireDemo/MathService</namespace>
      <serviceClass>com.zhuweisky.xfireDemo.MathService</serviceClass>
    
</service>
</beans>


    XFire会借助Spring来解析services.xml,从中提取需要发布为WebService的配置信息。

    很多文章介绍到这里就完了,然而当我按照他们所说的启动WebService ,然后通过http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl 来访问服务描述时,却抛出了异常,说services.xml文件不存在--
“org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [META-INF/xfire/services.xml]; nested exception is java.io.FileNotFoundException: class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist”。  

(7)非常关键的一点,就是这个小难题花费了我将近一天的时间。
    在WebContent\WEB-INF目录下新建classes文件夹,然后需要将WebContent下的整个META-INF文件夹剪切到新建的classes文件夹下。
    到这里,项目的完整目录结构如下:


  (8)在处理完这个问题后.从新部署并运Tomcat.但接着问题又来了错误内容如下:Unrecognized xbean element mapping: services in namespace                          http://xfire.codeh.
           经过分析得出XFire1.26需要xalan.jar包的支持.但它自身的Lib下无此jar。需要我们在apache官方下载.然后将此包放入工程的lib下
  (9)再次从新编译运行.本以为一切OK了.但还是出来问题java.lang.NoClassDefFoundError: org/apache/xml/serializer/TreeWalker错误
            这次通过在Apache官方找到了出错误的原因:
            原本这个类是包含在xalan.jar中的,但是xalan-j2.7.0版的发布包中,将serializer包中的类单独打包成serializer.jar,不再包含在xalan.jar中,所以才会即使添加了
            xalan.jar也无法找到该类,添加后即可解决问题
 (10)OK。一切搞定在IE中输入 http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl 会得到正确的web服务描述文档
   


评论

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)[未登录]  回复  更多评论   

2007-08-15 17:31 by Aqing
Xfire配合Spring的话,配置会更简单,呵呵

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)  回复  更多评论   

2007-08-18 09:31 by ianwong
我也遇到这个问题,不知道与你是否完全一样? 把您说的两个包放进去以后,问题依旧,好郁闷
Servlet threw load() exception
org.springframework.beans.factory.BeanDefinitionStoreException: Unrecognized xbean element mapping: beans in namespace http://xfire.codehaus.org/config/1.0
at org.apache.xbean.spring.context.v2a.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:258)
at org.apache.xbean.spring.context.v2a.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:152)
at org.apache.xbean.spring.context.v2.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:49)

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)[未登录]  回复  更多评论   

2007-08-20 09:50 by 萧萧牛郎
@ianwong兄.你的问题我也不太清楚。你可否加我QQ:285203392我帮你看看

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)  回复  更多评论   

2007-08-30 18:52 by goto
你好,我也刚做了可简单的例子,可是写客户端时,老是报这样的错误
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.codehaus.xfire.DefaultXFire.<init>(DefaultXFire.java:37)
at org.codehaus.xfire.XFireFactory.<init>(XFireFactory.java:36)
at org.codehaus.xfire.XFireFactory.newInstance(XFireFactory.java:61)
at org.codehaus.xfire.service.binding.ObjectServiceFactory.<init>(ObjectServiceFactory.java:112)
at client.Client.main(Client.java:37)
Caused by: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException) (Caused by org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException))
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
at org.codehaus.xfire.transport.DefaultTransportManager.<clinit>(DefaultTransportManager.java:26)
... 5 more
Caused by: org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException (Caused by java.lang.NullPointerException)
at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:397)
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
... 9 more
Caused by: java.lang.NullPointerException
at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:374)
... 10 more

难道还需要log吗,真是郁闷

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)[未登录]  回复  更多评论   

2007-10-11 18:16 by Anson
Have you fixed the problem?

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)[未登录]  回复  更多评论   

2007-12-29 10:00 by Alex
如果使用 spring2.0 版本以上。
需要修改services.xml 成如下形式:
<beans>
<service xmlns="http://xfire.codehaus.org/config/1.0">" target="_new" rel="nofollow">http://xfire.codehaus.org/config/1.0">
<name>...</name>
...
</service>
</beans>

否则一直会:org.springframework.beans.factory.BeanDefinitionStoreException: Unrecognized xbean element mapping: beans in namespace http://xfire.codehaus.org/config/1.0

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)  回复  更多评论   

2008-12-03 17:31 by mm
<service xmlns="http://xfire.codehaus.org/config/1.0">"" target="_new" rel="nofollow">http://xfire.codehaus.org/config/1.0">" target="_new" rel="nofollow">http://xfire.codehaus.org/config/1.0">


这里格式要是怎能么样的?

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)  回复  更多评论   

2008-12-06 20:15 by 你好
谢谢了

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)  回复  更多评论   

2009-03-13 14:33 by sssss
Spring 2.x support
Because of Spring 2.x new feature, services.xml default namespace must not be declared on the root element of configuration ( beans ) and need to be moved to <service> tag level.



<beans>
<service xmlns="http://xfire.codehaus.org/config/1.0">
<name/>
<namespace/>
...
...
</service>
</beans>

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)  回复  更多评论   

2009-03-13 14:36 by sssss
上面的答案是在官方网站上找到的,我觉得以后有问题大家还是上官方网找比较好,一针见血!

# re: XFire+MyEclipse+Tomcat6.0开发Webservice中遇到问题及解决方案(初级)  回复  更多评论   

2010-10-13 11:55 by 张辉武
谢谢!

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问