虚线以下内容是网络上找到的他人的方法,自己面临Unexpected character '>' (code 62) expected '=' 时尝试使用此法,但却不见效,后来发现,每当出现此错误,重新启动 (1)MyEclipse 或 (2) Tomcat 或  (3) 计算机 ( Computer)可 解决此问题。


------------------------------------------------------


声明:第一次开发WebService,第一次使用XFire,WebService方面的新手

目的:分享经验、备忘

时间:2008-01-22

错误说明:在调用WebService的时候报错:



​​


  1. org.codehaus.xfire.fault.XFireFault: Unexpected character '>' (code 62) expected '='  
org.codehaus.xfire.fault.XFireFault: Unexpected character '>' (code 62) expected '='


解决方案:在webService应用的web.xml中加入:



  1.    <filter>   
  2.     <filter-name>CompressingFilter</filter-name>   
  3.     <filter-class>   
  4.         com.planetj.servlet.filter.compression.CompressingFilter   
  5.     </filter-class>   
  6.     <init-param>   
  7.         <param-name>debug</param-name>   
  8.         <param-value>false</param-value>   
  9.     </init-param>   
  10.     <init-param>   
  11.         <param-name>statsEnabled</param-name>   
  12.         <param-value>true</param-value>   
  13.     </init-param>   
  14. </filter>   
  15. <filter-mapping>   
  16.     <filter-name>CompressingFilter</filter-name>   
  17.     <url-pattern>/services/*</url-pattern>   
  18. </filter-mapping>  
<filter>
<filter-name>CompressingFilter</filter-name>
<filter-class>
com.planetj.servlet.filter.compression.CompressingFilter
</filter-class>
<init-param>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>statsEnabled</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CompressingFilter</filter-name>
<url-pattern>/services/*</url-pattern>
</filter-mapping>



详细说明:

开发环境:

    服务器:Tomcat5.0

   JDK:  JDK1.4.2

   IDE:  MyEclicpse6.0.0 GA+Eclipse3.3

   其他:  XFire1.2.6

开发简要说明(代码就是SayHello,这里不再说明):

1、通过MyEclipse建立Web Service Project

2、通过MyEclipse新增WebService:

     service name:SayAny

    Service Interface: ISayAny

    Service Impl. class:  ISayAnyImpl

生成的Web.xml如下:



  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">   
  3.   <servlet>    
  4.     <servlet-name>XFireServlet</servlet-name>   
  5.     <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>   
  6.     <load-on-startup>0</load-on-startup>   
  7.   </servlet>   
  8.   <servlet-mapping>   
  9.     <servlet-name>XFireServlet</servlet-name>   
  10.     <url-pattern>/services/*</url-pattern>   
  11.   </servlet-mapping>   
  12.   <welcome-file-list>   
  13.     <welcome-file>index.jsp</welcome-file>   
  14.   </welcome-file-list>   
  15. </web-app>  
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>



services.xml内容如下:(新手说明:在项目下与WebRoot同级目录下,myEclipse自动生成一个WebServices目录,services.xml在此目录中)



  1. <beans xmlns="http://xfire.codehaus.org/config/1.0">   
  2. <service>   
  3. <name>SayAny</name>   
  4. <serviceClass>com.jiang.service.ISayAny</serviceClass>   
  5. <implementationClass>com.jiang.service.SayAnyImpl</implementationClass>   
  6. <style>wrapped</style>   
  7. <use>literal</use>   
  8. <scope>application</scope>   
  9. </service>   
  10. </beans>  
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>SayAny</name>
<serviceClass>com.jiang.service.ISayAny</serviceClass>
<implementationClass>com.jiang.service.SayAnyImpl</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>
</beans>



3、直接通过MyEclipse发布到Tomcat上;

4、访问http://localhost/studyWebService/services/SayAny?wsdl可以成功看到一个XML内容,里面内容不在此说明

5、编写测试程序,main方法如下:



  1. public static void main(String[] args) {   
  2.     String serviceURL = "http://localhost/studyWebService/services/SayAny";   
  3.        
  4.     String datas = "";   
  5.     //service   
  6.     Service serviceModel = new ObjectServiceFactory().create(   
  7.             ISayAny.class, null, "", null);   
  8.   
  9.     XFireProxyFactory serviceFactory = new XFireProxyFactory();   
  10.     try {   
  11.         ISayAny service = (ISayAny) serviceFactory.create(   
  12.                 serviceModel, serviceURL);   
  13.         Client client = ((XFireProxy) Proxy.getInvocationHandler(service)).getClient();   
  14.         client.setProperty(CommonsHttpMessageSender.GZIP_ENABLED,   
  15.                 Boolean.TRUE);   
  16.         client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "0");   
  17.         datas = service.sayHello("jiang shan");   
  18.         System.out.println(datas);   
  19.            
  20.     } catch (Exception e) {   
  21.         e.printStackTrace();   
  22.     }   
  23. }  
public static void main(String[] args) {
String serviceURL = "http://localhost/studyWebService/services/SayAny";

String datas = "";
//service
Service serviceModel = new ObjectServiceFactory().create(
ISayAny.class, null, "", null);

XFireProxyFactory serviceFactory = new XFireProxyFactory();
try {
ISayAny service = (ISayAny) serviceFactory.create(
serviceModel, serviceURL);
Client client = ((XFireProxy) Proxy.getInvocationHandler(service)).getClient();
client.setProperty(CommonsHttpMessageSender.GZIP_ENABLED,
Boolean.TRUE);
client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "0");
datas = service.sayHello("jiang shan");
System.out.println(datas);

} catch (Exception e) {
e.printStackTrace();
}
}



WebServer获得相应,但在



  1. datas = service.sayHello("jiang shan");  
datas = service.sayHello("jiang shan");

报错:

错误如下:



  1.   
  2. com.jiang.service.TestAdStatData  - Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Unexpected character '>' (code 62) expected '='  
  3.  at [row,col {unknown-source}]: [1,708]   
  4. org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Unexpected character '>' (code 62) expected '='  
  5.  at [row,col {unknown-source}]: [1,708]   
  6. org.codehaus.xfire.fault.XFireFault: Unexpected character '>' (code 62) expected '='  
  7.  at [row,col {unknown-source}]: [1,708]   
  8.     at org.codehaus.xfire.fault.XFireFault.createFault(XFireFault.java:89)   
  9.     at org.codehaus.xfire.client.Client.onReceive(Client.java:391)   
  10.     at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)   
  11.     at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)   
  12.     at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)   
  13.     at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)   
  14.     at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:75)   
  15.     at org.codehaus.xfire.client.Client.invoke(Client.java:335)   
  16.     at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)   
  17.     at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)   
  18.     at $Proxy0.getAdDataByUidAndPosId(Unknown Source)   
  19.     at com.jiang.service.TestAdStatData.main(TestAdStatData.java:37)   
  20. Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '>' (code 62) expected '='  
  21.  at [row,col {unknown-source}]: [1,708]   
  22.     at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:623)   
  23.     at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:2999)   
  24.     at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2934)   
  25.     at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2846)   
  26.     at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1019)   
  27.     at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:44)   
  28.     at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)   
  29.     at org.codehaus.xfire.client.Client.onReceive(Client.java:387)   
  30.     ... 10 more  
com.jiang.service.TestAdStatData  - Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Unexpected character '>' (code 62) expected '='
at [row,col {unknown-source}]: [1,708]
org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Unexpected character '>' (code 62) expected '='
at [row,col {unknown-source}]: [1,708]
org.codehaus.xfire.fault.XFireFault: Unexpected character '>' (code 62) expected '='
at [row,col {unknown-source}]: [1,708]
at org.codehaus.xfire.fault.XFireFault.createFault(XFireFault.java:89)
at org.codehaus.xfire.client.Client.onReceive(Client.java:391)
at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
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:75)
at org.codehaus.xfire.client.Client.invoke(Client.java:335)
at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
at $Proxy0.getAdDataByUidAndPosId(Unknown Source)
at com.jiang.service.TestAdStatData.main(TestAdStatData.java:37)
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '>' (code 62) expected '='
at [row,col {unknown-source}]: [1,708]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:623)
at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:2999)
at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2934)
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2846)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1019)
at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:44)
at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at org.codehaus.xfire.client.Client.onReceive(Client.java:387)
... 10 more



解决方案本文上面所说:加入pjl-comp-filter-1.4.6.jar,并在Web.xml中配置filter即可。


出错原因:这句有问题:


  1. client.setProperty(CommonsHttpMessageSender.GZIP_ENABLED,Boolean.TRUE);  
client.setProperty(CommonsHttpMessageSender.GZIP_ENABLED,Boolean.TRUE);


客户端调用时设置了GZIP参数,但Server端没有用GZIP过滤文件!