我注意到CXF有两个不同的Release (v2.0.7 & v2.1.1)。这两个版本在AegisDatabinding方面有一些区别。
对于V2.0.7版本,仍然保留了org.apache.cxf.aegis.type.TypeMappingRegistry
和org.apache.cxf.aegis.type.DefaultTypeMappingRegistry。这类似于XFire中对于Aegis的binding支持。Developer可以通过:
TypeMapping typeMapping = registry.getDefaultTypeMapping();
if (typeMapping.isRegistered(MyType.class)) {
typeMapping.removeType(typeMapping.getType(myType.getTypeClass()));
}
typeMapping.register(new Mytype());
public class MyType extends Type {
@Override
public .... readObject() {....}
@Override
public .... writeObject() {.....}
}
加入自定义类或没有无参构造器类的Aegis Databinding. 如 对于java.util.UUID类(经常使用它作为实体的主键)。
对于V2.1.1版本,取消了上述的org.apache.cxf.aegis.type.TypeMappingRegistry
和org.apache.cxf.aegis.type.DefaultTypeMappingRegistry。但是加入了AegisContext,它包含TypeMapping。并且,AegisContext被包含在AegisDataBinding类中,并且多出了一个DefaultTypeMapping的TypeMapping实现类。
我觉得大致的Aegis Databinding过程如下:
产生一个AegisDatabinding 对其进行TypeMapping的处理,如下:
public static AegisDatabinding createAegisDatabinding() {
AegisDatabinding aegisDatabinding = new AegisDatabinding();
AegisContext aegisContext = aegisDatabinding.getAegisContext();
TypeMapping mapping = new DefaultTypeMapping();
if (mapping.isRegistered(UUIDType.class)) {
mapping.removeType(new UUIDType());
}
mapping.register(new UUIDType());
aegisContext.setTypeMapping(mapping);
aegisContext.initialize();
aegisDatabinding.setAegisContext(aegisContext);
return aegisDatabinding;
}
之后,配置jaxws:endpoint,如下(serserBeans.xml):
<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" />
<import resource="classpath:META-INF/cxf/cxf-extension-local.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-jms.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<bean id="userService" class="demo.service.UserService"/>
<bean id="aegisDatabinding"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
scope="singleton">
<property name="staticMethod"
value="demo.service.type.AegisTypeMappingHelper.createAegisDatabinding"/>
</bean>
<bean id="serviceFactory" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean" scope="prototype">
<property name="dataBinding" ref="aegisDatabinding" />
<property name="serviceConfigurations">
<list>
<bean class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration" />
<bean class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration" />
<bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration" />
</list>
</property>
</bean>
<bean id="logInbound"
class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="logOutbound"
class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<jaxws:endpoint id="userServiceEndpoint" implementor="#userService" address="http://localhost:9002/UserService">
<jaxws:inInterceptors>
<ref bean="logInbound" />
<ref bean="logOutbound" />
</jaxws:inInterceptors>
<jaxws:serviceFactory>
<ref bean="serviceFactory" />
</jaxws:serviceFactory>
</jaxws:endpoint>
对应的客户端配置文件:(clientBeans.xml)
<import resource="classpath:demo/service/serverBeans.xml" />
<bean id="userServiceTestClient" class="demo.service.UserService" />
<bean id="userServiceClient"
class="demo.service.IUserService" factory-bean="clientFactory"
factory-method="create" />
<bean id="clientFactory"
class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass"
value="demo.service.IUserService" />
<property name="address"
value="http://localhost:9002/UserServiceService" />
<property name="serviceFactory" ref="serviceFactory" />
</bean>
测试代码:
import java.util.UUID;
import javax.annotation.Resource;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import demo.domain.IUser;
import demo.domain.User;
import demo.service.IUserService;
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
@ContextConfiguration(locations={"classpath:demo/service/clientBeans.xml","classpath:demo/service/serverBeans.xml"})
public class UserServiceTestCase extends Assert implements ApplicationContextAware {
ApplicationContext applicationContext;
IUserService userService;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
public ApplicationContext getApplicationContext() {
return applicationContext;
}
@Resource(name="userServiceTestClient")
public void setUserService(IUserService userService) {
this.userService = userService;
}
@Test
public void testCreateUser() throws Exception {
IUser user = new User();
user.setId(UUID.randomUUID());
user.setName("Johnny");
userService.createUser(user);
}
@Test
public void testFindUserById() throws Exception {
userService.findUserById(UUID.randomUUID());
}
@Test
public void testFindUserByName() throws Exception {
userService.findUserByName("Johnny");
}
@Test
public void testGetUserMap() throws Exception {
userService.getUserMap();
}
@Test
public void testFindUserListByName() throws Exception {
userService.findUserListByName("Johnny");
}
}
但是,server无法正常启动。我怀疑是UUID没有被正确的mapping。报错是schema重复冲突,如果不设置UUIDType的schema则会报NullPointerException。
Project在附件中。
请大家不吝赐教在V2.1.1环境下正确配置此种AegisDatabinding的方法。
相关推荐
CXF 2.1.1是该框架的一个早期版本,尽管如此,它仍然包含了构建基于SOAP和RESTful服务的基础组件。 Apache CXF的核心特性包括: 1. **SOAP支持**:CXF支持SOAP 1.1和1.2,以及WSDL 1.1和2.0。它提供了一个强大的...
cxf-2.0.7.jar
- **Spring XML配置**:在Spring配置文件中定义CXF客户端和服务端的安全策略,例如使用`<cxf:bus>`和`<cxf:properties>`元素。 - **WSDL-first方式**:在WSDL文件中定义安全策略,CXF会自动读取并应用这些策略。 *...
在IT行业中,尤其是在Web服务开发领域,CXF是一个广泛应用的开源框架,用于构建和开发SOAP和RESTful服务。当我们处理中文或者其他非ASCII字符时,编码问题可能会成为一个棘手的问题。"cxf使用中编码问题"这个主题...
Apache CXF是一个开源的服务框架,它允许开发人员构建和部署SOAP和RESTful Web服务。CXF的名字来源于"CXF = ...在实际使用时,确保正确配置JDK和CXF,以及充分了解CXF的功能和用法,将有助于提高开发效率和服务质量。
Apache CXF 是一个开源的Java框架,主要用于构建和开发服务导向架构(Service-Oriented Architecture, SOA)和Web服务。本学习笔记旨在提供对Apache CXF的基本理解、功能特性和实际操作指导。 **1. CXF 简介** 1.1...
这个问题在标题“cxf和xfire的jar包冲突解决”中得到了明确指出。 Apache CXF是一个全面的服务开发框架,它支持SOAP、RESTful Web服务,以及多种协议和绑定。而XFire是CXF的前身,也是一个强大的Web服务框架,但它...
在本文中,我们将详细讨论CXF服务端和客户端所需的核心jar包及其作用。 1. **JAX-WS与JAX-RS支持**: CXF的核心功能之一是提供对JAX-WS和JAX-RS规范的实现。JAX-WS用于创建基于SOAP的Web服务,而JAX-RS则用于创建...
- 社区论坛:Stack Overflow和其他技术社区有很多关于SpringBoot+CXF整合的问题和解答,可以作为参考。 6. **调试与测试** - 使用`mvnw`或`mvnw.cmd`可以运行Maven命令,例如`mvn spring-boot:run`启动应用。 - ...
在IT行业中,Web服务是一种广泛使用的通信方式,它允许不同系统之间通过网络交换数据和执行功能。Apache CXF和camel-cxf是两个流行的开源框架,它们可以帮助开发者轻松地创建、消费和集成Web服务。本篇文章将详细...
在实际应用中,将这些jar包添加到项目的类路径中,就可以使用CXF提供的API来创建和调用Web服务。为了使用这些jar包,开发者通常需要配置CXF的Spring Bean,或者使用Maven或Gradle等构建工具管理依赖。同时,对于...
在 Java 开发领域,Apache CXF 是一个流行的开源框架,用于构建和开发服务导向架构(SOA)的应用程序。它提供了多种方式来实现 Web 服务,包括 JAX-WS 和 JAX-RS。另一方面,Spring 框架是 Java 应用程序开发的核心...
在本文中,我们将探讨CXF和Axis2框架的区别,以帮助开发者更好地选择适合自己的框架。 架构设计 Axis2是一个对Axis进行了彻底的重写的一个新项目,它使用了新的模块化架构,更加方便于功能性的扩展等等。Apache ...
- 日志和调试:CXF支持日志记录和调试工具,帮助开发者定位问题。 **5. RESTful服务与CXF** 除了传统的SOAP服务,CXF也支持RESTful服务的开发。REST(Representational State Transfer)是一种轻量级的架构风格,...
在CXF2.2.3这个完整架包中,`apache-cxf-2.2.3lib`目录包含了所有必要的库文件,这些文件是CXF运行和开发服务所必需的。以下是一些关于CXF2.2.3及其库文件的关键知识点: 1. **服务提供者接口(SPI)**:CXF支持JAX...
JAVA7和JAVA8对应CXF资源 WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- ...
在IT行业中,尤其是在Java Web开发领域,Apache CXF是一个广泛使用的开源框架,它用于构建和服务导向架构(SOA)的应用程序。CXF允许开发者通过多种Web服务标准来创建和消费Web服务,包括SOAP和RESTful服务。然而,...
在开发过程中,了解CXF的组件结构和工作原理,以及如何配置和使用其提供的各种功能,对于高效地开发和维护Web服务至关重要。记得在使用第三方资源时,要确保jar包的来源可靠,避免引入潜在的安全风险。同时,保持...
Java CXF Webservice接口在处理Web服务时,可能会遇到跨域问题,这通常是由于浏览器的安全策略限制了不同源之间的通信。解决这个问题的关键在于理解和应用CORS(Cross-Origin Resource Sharing)机制。CORS允许...
如果问题仍然存在,可能需要进一步检查是否有其他第三方库也在类路径中包含了不同版本的JAXB,或者考虑升级或降级CXF和JAXB的版本以匹配兼容的组合。 总的来说,处理CXF与JAXB的版本冲突需要对Java的类加载机制有...