CXF集成Spring报下面错误:
Error creating bean with name 'cxf': Singleton bean creation not
allowed while the singletons of this factory are in destruction (Do
not request a bean from a BeanFactory in a destroy method
implementation!)
原因是CXF 不支持Timestamp
解决方案参照
http://www.blogjava.net/absolutedo/archive/2010/11/27/339190.html
在项目中使用Apache开源的Services Framework CXF来发布WebService,CXF能够很简洁与Spring Framework 集成在一起,在发布WebService的过程中,发布的接口的入参有些类型支持不是很好,比如Timestamp和Map。这个时候我们就需要编写一些适配来实行类型转换。
Timestamp:
2 * <java.sql.Timestamp类型转换>
3 * <功能详细描述>
4 *
5 * @author Owen
6 * @version [版本号, 2010-11-26]
7 * @see [相关类/方法]
8 * @since [产品/模块版本]
9 */
10public class TimestampAdapter extends XmlAdapter<String, Timestamp>
11{
12 /** <一句话功能简述>
13 * <功能详细描述>
14 * @param time
15 * @return
16 * @throws Exception
17 * @see [类、类#方法、类#成员]
18 */
19 public String marshal(Timestamp time)
20 throws Exception
21 {
22 return DateUtil.timestamp2Str(time);
23 }
24
25 /** <一句话功能简述>
26 * <功能详细描述>
27 * @param v
28 * @throws Exception
29 * @see [类、类#方法、类#成员]
30 */
31 public Timestamp unmarshal(String str)
32 throws Exception
33 {
34 return DateUtil.str2Timestamp(str);
35 }
36
37}
DateUtil
2 * 文 件 名: DateUtil.java
3 * 版 权: 4 Dream Co., Ltd. Copyright YYYY-YYYY, All rights reserved
4 * 描 述: <描述>
5 * 修 改 人: Owen
6 * 修改时间: 2010-11-5
7 * 跟踪单号: <跟踪单号>
8 * 修改单号: <修改单号>
9 * 修改内容: <修改内容>
10 */
11package com.osoft.portal.common.util.commons;
12
13import java.sql.Timestamp;
14import java.text.ParseException;
15import java.text.SimpleDateFormat;
16import java.util.Date;
17
18import org.apache.log4j.Logger;
19
20/**
21 * <一句话功能简述>
22 * <功能详细描述>
23 *
24 * @author Owen
25 * @version [版本号, 2010-11-5]
26 * @see [相关类/方法]
27 * @since [产品/模块版本]
28 */
29public class DateUtil
30{
31 /**
32 * 注释内容
33 */
34 private static final Logger log = Logger.getLogger(DateUtil.class);
35
36 /**
37 * 默认日期格式
38 */
39 private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
40
41 /** <默认构造函数>
42 */
43 private DateUtil()
44 {
45 }
46
47 /** <字符串转换成日期>
48 * <如果转换格式为空,则利用默认格式进行转换操作>
49 * @param str 字符串
50 * @param format 日期格式
51 * @return 日期
52 * @see [类、类#方法、类#成员]
53 */
54 public static Date str2Date(String str, String format)
55 {
56 if (null == str || "".equals(str))
57 {
58 return null;
59 }
60 //如果没有指定字符串转换的格式,则用默认格式进行转换
61 if (null == format || "".equals(format))
62 {
63 format = DEFAULT_FORMAT;
64 }
65 SimpleDateFormat sdf = new SimpleDateFormat(format);
66 Date date = null;
67 try
68 {
69 date = sdf.parse(str);
70 return date;
71 }
72 catch (ParseException e)
73 {
74 log.error("Parse string to date error!String : " + str);
75 }
76
77 return null;
78 }
79
80 /** <一句话功能简述>
81 * <功能详细描述>
82 * @param date 日期
83 * @param format 日期格式
84 * @return 字符串
85 * @see [类、类#方法、类#成员]
86 */
87 public static String date2Str(Date date, String format)
88 {
89 if (null == date)
90 {
91 return null;
92 }
93 SimpleDateFormat sdf = new SimpleDateFormat(format);
94 return sdf.format(date);
95 }
96
97 /** <时间戳转换为字符串>
98 * <功能详细描述>
99 * @param time
100 * @return
101 * @see [类、类#方法、类#成员]
102 */
103 public static String timestamp2Str(Timestamp time)
104 {
105 Date date = new Date(time.getTime());
106 return date2Str(date, DEFAULT_FORMAT);
107 }
108
109 /** <一句话功能简述>
110 * <功能详细描述>
111 * @param str
112 * @return
113 * @see [类、类#方法、类#成员]
114 */
115 public static Timestamp str2Timestamp(String str)
116 {
117 Date date = str2Date(str, DEFAULT_FORMAT);
118 return new Timestamp(date.getTime());
119 }
120}
121
在具体的Java Bean 中,通过@XmlJavaTypeAdapter注解来通知CXF进行类型转换,具体请看User中的属性registerDate的getter 和setter
2
3import java.io.Serializable;
4import java.sql.Timestamp;
5
6import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
7
8import com.osoft.portal.common.util.commons.DateUtil;
9import com.osoft.portal.remote.convert.TimestampAdapter;
10
11/**
12 * <一句话功能简述>
13 * <功能详细描述>
14 *
15 * @author Owen
16 * @version [版本号, 2010-11-1]
17 * @see [相关类/方法]
18 * @since [产品/模块版本]
19 */
20public class User implements Serializable
21{
22 private static final long serialVersionUID = -6449817937177158567L;
23
24 /**
25 * 用户标示
26 */
27 private long id;
28
29 /**
30 * 登录账号
31 */
32 private String username;
33
34 /**
35 * 登录密码
36 */
37 private String password;
38
39 /**
40 * 真实姓名
41 */
42 private String realName;
43
44 /**
45 * 性别
46 */
47 private String sex;
48
49 /**
50 * 注册日期
51 */
52 private Timestamp registerDate;
53
54 /**
55 * 用户状态
56 */
57 private String state;
58
59 /** <默认构造函数>
60 */
61 public User()
62 {
63 }
64
65 public long getId()
66 {
67 return id;
68 }
69
70 public void setId(long id)
71 {
72 this.id = id;
73 }
74
75 public String getUsername()
76 {
77 return username;
78 }
79
80 public void setUsername(String username)
81 {
82 this.username = username;
83 }
84
85 public String getPassword()
86 {
87 return password;
88 }
89
90 public void setPassword(String password)
91 {
92 this.password = password;
93 }
94
95 public String getRealName()
96 {
97 return realName;
98 }
99
100 public void setRealName(String realName)
101 {
102 this.realName = realName;
103 }
104
105 public String getSex()
106 {
107 return sex;
108 }
109
110 public void setSex(String sex)
111 {
112 this.sex = sex;
113 }
114
115 @XmlJavaTypeAdapter(TimestampAdapter.class)
116 public Timestamp getRegisterDate()
117 {
118 return registerDate;
119 }
120
121 public void setRegisterDate(@XmlJavaTypeAdapter(TimestampAdapter.class) Timestamp registerDate)
122 {
123 this.registerDate = registerDate;
124 }
125
126 public String getState()
127 {
128 return state;
129 }
130
131 public void setState(String state)
132 {
133 this.state = state;
134 }
135
136 /** <一句话功能简述>
137 * <功能详细描述>
138 * @return
139 * @see [类、类#方法、类#成员]
140 */
141 public String toString()
142 {
143 StringBuilder build = new StringBuilder();
144 build.append("Real Name: " + this.getRealName() + ",Register Date: "
145 + DateUtil.timestamp2Str(this.getRegisterDate()));
146 return build.toString();
147 }
148
149}
150
OK,这个时候CXF解析Java Bean User的时候,解析到@XmlJavaTypeAdapter注解时候就会以TimestampAdapter这个适配器来进行Timestamp与String之间的转换。
Map:
这里贴下上一个项目中java.util.Map写的转换器,参考javaeye上一个网友提示的,直接用xstream将Map转换成String
2 * <数据模型转换>
3 * <Map<String,Object> 与 String之间的转换>
4 *
5 * @author Owen
6 * @version [版本号, Apr 28, 2010]
7 * @see [相关类/方法]
8 * @since [产品/模块版本]
9 */
10@XmlType(name = "MapAdapter")
11@XmlAccessorType(XmlAccessType.FIELD)
12public class MapAdapter extends XmlAdapter<String, Map<String, Object>>
13{
14
15 /**
16 * Convert a bound type to a value type.
17 * 转换JAXB不支持的对象类型为JAXB支持的对象类型
18 *
19 * @param map map
20 * The value to be convereted. Can be null.
21 * @return String
22 * @throws Exception
23 * if there's an error during the conversion. The caller is responsible for
24 * reporting the error to the user through {@link javax.xml.bind.ValidationEventHandler}.
25 */
26 public String marshal(Map<String, Object> map)
27 throws Exception
28 {
29 XStream xs = new XStream(new DomDriver());
30 return xs.toXML(map);
31 }
32
33 /**
34 * Convert a value type to a bound type.
35 * 转换JAXB支持的对象类型为JAXB不支持的的类型
36 *
37 * @param model
38 * The value to be converted. Can be null.
39 * @return Map<String,Object>
40 * @throws Exception
41 * if there's an error during the conversion. The caller is responsible for
42 * reporting the error to the user through {@link javax.xml.bind.ValidationEventHandler}.
43 */
44 @SuppressWarnings("unchecked")
45 public Map<String, Object> unmarshal(String model)
46 throws Exception
47 {
48 XStream xs = new XStream(new DomDriver());
49 return (HashMap)xs.fromXML(model);
50 }
51
52}
相关推荐
例如,如果你的Web服务不涉及安全认证,可以不包含`cxf-rt-ws-security.jar`;如果不需要集群,那么`cxf-rt-features-clustering.jar`也可以省略。但请注意,精简过多可能会导致功能缺失或运行错误,因此需要确保你...
WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- 3.2之前版本 java 6 3.1 ...
在“lib”目录下的文件,很可能是CXF框架的各种依赖库,包括但不限于以下组件: - CXF的核心库,提供基本的Web服务功能。 - JAXB(Java Architecture for XML Binding)库,用于XML数据和Java对象之间的转换。 - JAX...
Apache CXF 2.7.18是该框架的一个稳定版本,提供了对Java EE、JAX-WS和JAX-RS标准的强大支持。 CXF的主要特性包括: 1. **SOAP支持**:Apache CXF允许开发者创建和消费SOAP 1.1和1.2服务。它支持WSDL(Web服务描述...
6. **MTOM/XOP**:CXF支持Message Transmission Optimization Mechanism (MTOM) 和XML-binary Attachment Optimization Protocol (XOP),优化了大型二进制数据在SOAP消息中的传输。 7. **国际化和本地化**:CXF允许...
C#动态调用CXF WEBSERVICE框架共通类。
Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL...
在进行CXF开发时,依赖的一系列jar包是不可或缺的,它们包含了CXF运行所需的类库和组件。 1. **CXF的核心组件**: CXF的核心组件包括了处理SOAP消息、WSDL解析、服务发现等功能的类库。这些jar包通常包含`cxf-rt-...
3. **JAX-WS和JAX-RS支持**:CXF支持JAX-WS(Java API for XML Web Services)和JAX-RS(Java API for RESTful Web Services)。确保WebSphere环境中已经安装了相应的IBM JAX-WS和JAX-RS提供者,或者使用CXF自身的...
如果你打算升级到更高版本的Java或CXF,务必了解新版本的特性变化和兼容性要求,以免出现不兼容的问题。 总的来说,"CXF2.6.4配java1.6版完整包和使用说明"是Java 1.6开发者构建Web服务的宝贵资源,提供了完整的...
1. **SOAP支持**:CXF能够处理SOAP 1.1和1.2消息,支持WSDL(Web服务描述语言)的第一和第二版本,用于定义服务接口。 2. **RESTful服务**:除了传统的SOAP服务,CXF也支持Representational State Transfer(REST)...
Apache CXF目前暂不支持多语言,但能够与Spring进行无缝的整合,提供更加灵活的语言支持。 选择合适的框架 在选择webservices框架时,需要考虑以下几点: 1. 如果应用程序需要多语言的支持,Axis2应当是首选。 2....
CXF支持多种Web服务标准,如WS-I Basic Profile、WS-Security、WS-ReliableMessaging等,同时提供SOAP、RESTful API和JSON的支持。 **2. 版本3.4.3** Apache CXF 3.4.3是该框架的一个稳定版本,它修复了之前版本的...
2. **JAX-RS支持**:CXF也支持JAX-RS(Java API for RESTful Web Services),这使得开发RESTful服务变得简单。通过使用注解,如`@Path`、`@GET`、`@POST`等,开发者可以轻松地创建资源和操作。 3. **多种绑定机制*...
CXF的名字来源于"Code first"和"XML first",代表着它支持从Java代码或者XML定义来创建Web服务。CXF 3.1.1是该项目的一个特定版本,包含了对当时Web服务标准和协议的良好支持。 在描述中提到,你遇到了官方下载页面...
4. **WSDL第一**和**代码第一**:CXF支持两种开发模式,即从WSDL文件生成Java代码(WSDL First)和从已有Java类生成WSDL(Code First)。 5. **客户端API**:CXF提供了一个强大的客户端API,使得调用Web服务变得...
CXF不仅支持WSDL第一和WSDL第二风格的服务开发,还提供了丰富的API和工具来简化Web服务的实现。 【描述】"cxf服务端开发" 强调了CXF在构建服务端应用程序的核心功能。使用CXF,开发者可以轻松地实现WS-*规范(如...
1. **Web服务实现**:CXF支持JAX-WS(Java API for XML Web Services)标准,使开发者能够基于接口定义轻松地创建服务端和客户端。 2. **RESTful服务**:CXF同样支持JAX-RS(Java API for RESTful Web Services),...
CXF支持多种Web服务标准,包括但不限于: 1. **SOAP (Simple Object Access Protocol)**:这是一种基于XML的协议,用于在分布式环境中交换结构化和类型化的信息。CXF支持SOAP 1.1和1.2版本。 2. **WSDL (Web ...
11. **多语言支持**:虽然主要是Java框架,但CXF还支持其他编程语言,如Python,通过CXF4Python项目。 12. **持续集成**:"milestone2"表示这是该版本的第二个里程碑,通常在正式版本发布前,这些里程碑版本会经过...