论坛首页 Java企业应用论坛

WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单

浏览 51152 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-27  
引用

Java代码
信息: Interceptor has thrown exception, unwinding now  
org.apache.cxf.interceptor.Fault: Marshalling Error: class com.color.webterminal.ws.dto.UserDTO nor any of its super class is known to this context.  
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:207)  
    at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:63) 

信息: Interceptor has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Marshalling Error: class com.color.webterminal.ws.dto.UserDTO nor any of its super class is known to this context.
at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:207)
at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:63)


报上面错误啊,按照楼主的做的代码,Help me


有没有用annotation标注JAVA-XML映射呀?
/**  
 * Web Service传输User信息的DTO.  
 *   
 * 分离entity类与web service接口间的耦合,隔绝entity类的修改对接口的影响.  
 * 使用JAXB 2.0的annotation标注JAVA-XML映射,尽量使用默认约定.  
 *   
 */  
@XmlAccessorType(XmlAccessType.FIELD)   
@XmlType(name = "User")   
public class UserDTO {   
  
    protected Integer id;   
  
    protected String name;   
  
    public Integer getId() {   
        return id;   
    }   
  
    public void setId(Integer value) {   
        id = value;   
    }   
  
    public String getName() {   
        return name;   
    }   
  
    public void setName(String value) {   
        name = value;   
    }   
} 
0 请登录后投票
   发表时间:2008-04-17  
我也遇到了同样的问题。
p.s.我用的是 spring 2.5.2 + cxf 2.0.5 bundle
0 请登录后投票
   发表时间:2008-04-17  
如果只是要开发web serivices的话用xfire就够了吧?cxf 50M的运行库吓死人。
0 请登录后投票
   发表时间:2008-04-18  
我也考虑换 xfire 了,不知道 xfire 对 jax-ws 的系列标准支持的怎么样。
0 请登录后投票
   发表时间:2008-04-21  
我用的就是 cxf2.0.5 + spring2.5.2 ,还是有NPE
0 请登录后投票
   发表时间:2008-04-21  
我想问下,这个要在http里怎么请求,在网上找了个HELLOWORLD的例子,但是只能在java运行,没有http请求路径(http://localhost:8080/cxf/ws/helloWorld?wsdl后面如何把参数传进去)
0 请登录后投票
   发表时间:2008-04-22  
NPE 的错误似乎是由于 bus 没有被注入。但是按照楼主的帖子,并不需要注入这个才对。另外,我把 war 部署到 Jboss 4.2,启动服务器的时候,有这样的错误:

09:36:08,607 ERROR [STDERR] 2008-4-22 9:36:08 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
。。。。

09:36:09,588 ERROR [STDERR] 2008-4-22 9:36:09 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
。。。。

09:36:10,079 ERROR [STDERR] 2008-4-22 9:36:10 org.apache.cxf.endpoint.ServerImpl initDestination
信息: Setting the server's publish address to be /MoscoService
0 请登录后投票
   发表时间:2008-04-22  
gigi_ly180 写道
我想问下,这个要在http里怎么请求,在网上找了个HELLOWORLD的例子,但是只能在java运行,没有http请求路径(http://localhost:8080/cxf/ws/helloWorld?wsdl后面如何把参数传进去)


不明白你的问题是什么,你是问在调用的client的时候如何将wsdl 的url 传给client吗?
0 请登录后投票
   发表时间:2008-04-22  
alexma 写道
NPE 的错误似乎是由于 bus 没有被注入。但是按照楼主的帖子,并不需要注入这个才对。另外,我把 war 部署到 Jboss 4.2,启动服务器的时候,有这样的错误:
09:36:08,607 ERROR [STDERR] 2008-4-22 9:36:08 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
。。。。
09:36:09,588 ERROR [STDERR] 2008-4-22 9:36:09 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
。。。。
09:36:10,079 ERROR [STDERR] 2008-4-22 9:36:10 org.apache.cxf.endpoint.ServerImpl initDestination
信息: Setting the server's publish address to be /MoscoService

这些信息不是错误信息,这是因为CXF使用的是j.u.l 而不是Jboss使用的log4j。这样CXF的日志输出就被定向到了错误输出流里面了。 你看到这些日志应该是 INFO level的。
对于NPE,的确是楼主在配置client factory的过程中没有制定bus 而造成的。
如果不想指定bus你可以使用 来定义客户端。
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:jaxws="http://cxf.apache.org/jaxws"
      xmlns:soap="http://cxf.apache.org/bindings/soap"
      xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<jaxws:client id="wsdlLocation" 
    serviceClass="org.apache.hello_world_soap_http.Greeter"
    serviceName="s:SOAPService"
    endpointName="s:SoapPort"
    xmlns:s="http://apache.org/hello_world_soap_http"
    address="http://localhost:8080/simpleWithAddress"
    wsdlLocation="wsdl/hello_world.wsdl"/>



或者是将bus配置到JaxWsClientFactory中去
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">
     <import resource="classpath:META-INF/cxf/cxf.xml"/>
   <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
   <import resource="classpath:META-INF/cxf/cxf-extension-http.xml"/> 
	<!-- ws client -->
	<bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService"
		factory-bean="identityValidateServiceClientFactory" factory-method="create">
        <property name="bus" ref="cxf" />
        </bean> 

	<bean id="identityValidateServiceClientFactory"
		class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="serviceClass"
			value="cn.org.coral.admin.service.IdentityValidateService" />
		<property name="address"
			value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>
	</bean>
	
</beans>


0 请登录后投票
   发表时间:2008-04-22  
引用

或者是将bus配置到JaxWsClientFactory中去
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">
     <import resource="classpath:META-INF/cxf/cxf.xml"/>
   <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
   <import resource="classpath:META-INF/cxf/cxf-extension-http.xml"/> 
	<!-- ws client -->
	<bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService"
		factory-bean="identityValidateServiceClientFactory" factory-method="create">
        <property name="bus" value="#cxf" />
        </bean> 

	<bean id="identityValidateServiceClientFactory"
		class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="serviceClass"
			value="cn.org.coral.admin.service.IdentityValidateService" />
		<property name="address"
			value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>
	</bean>
	
</beans>





多谢楼上回复,按照你的配置,问题已经解决。但是你这段配置有一个错误
<property name="bus" value="#cxf" />
这一行应该配置在 identityValidateServiceClientFactory 这个 bean 中,如果配置在 identityValidateServiceClient 这个 bean ,会报找不到 property 的错误。
另外,应该写成 <property name="bus" ref="cxf">
按照你的写法会出现 classcast 错误:不能把 String 转成 Bus 对象。


我修改了你的配置,如下:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">
     <import resource="classpath:META-INF/cxf/cxf.xml"/>
   <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
   <import resource="classpath:META-INF/cxf/cxf-extension-http.xml"/> 
	<!-- ws client -->
	<bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService"
		factory-bean="identityValidateServiceClientFactory" factory-method="create">
        </bean> 

	<bean id="identityValidateServiceClientFactory"
		class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="serviceClass"
			value="cn.org.coral.admin.service.IdentityValidateService" />
		<property name="address"
			value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>
                <property name="bus" ref="cxf" />
	</bean>
	
</beans>

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics