`
zhlfz
  • 浏览: 27877 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

CXF 不支持Timestamp

阅读更多

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:

 1/**
 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

  1/*
  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

  1package com.osoft.portal.system.model;
  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

 1/**
 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}

 

 

 

分享到:
评论

相关推荐

    CXF客户端支持最少jar

    例如,如果你的Web服务不涉及安全认证,可以不包含`cxf-rt-ws-security.jar`;如果不需要集群,那么`cxf-rt-features-clustering.jar`也可以省略。但请注意,精简过多可能会导致功能缺失或运行错误,因此需要确保你...

    cxf-3.1.5 和 cxf-3.3.13 JAVA7和JAVA8对应CXF资源

    WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- 3.2之前版本 java 6 3.1 ...

    cxf的jar包

    在“lib”目录下的文件,很可能是CXF框架的各种依赖库,包括但不限于以下组件: - CXF的核心库,提供基本的Web服务功能。 - JAXB(Java Architecture for XML Binding)库,用于XML数据和Java对象之间的转换。 - JAX...

    apache-cxf2.7.18官方版最稳定版本

    Apache CXF 2.7.18是该框架的一个稳定版本,提供了对Java EE、JAX-WS和JAX-RS标准的强大支持。 CXF的主要特性包括: 1. **SOAP支持**:Apache CXF允许开发者创建和消费SOAP 1.1和1.2服务。它支持WSDL(Web服务描述...

    cxf-2.4.2 jar包

    6. **MTOM/XOP**:CXF支持Message Transmission Optimization Mechanism (MTOM) 和XML-binary Attachment Optimization Protocol (XOP),优化了大型二进制数据在SOAP消息中的传输。 7. **国际化和本地化**:CXF允许...

    C#动态调用CXF WEBSERVICE框架的共通类

    C#动态调用CXF WEBSERVICE框架共通类。

    apache-cxf-3.1.1

    Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了JAX-WS API (遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL...

    CXF开发所需jar包

    在进行CXF开发时,依赖的一系列jar包是不可或缺的,它们包含了CXF运行所需的类库和组件。 1. **CXF的核心组件**: CXF的核心组件包括了处理SOAP消息、WSDL解析、服务发现等功能的类库。这些jar包通常包含`cxf-rt-...

    在WebSphere发布CXF注意事项

    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自身的...

    CXF2.6.4配java1.6版完整包和使用说明

    如果你打算升级到更高版本的Java或CXF,务必了解新版本的特性变化和兼容性要求,以免出现不兼容的问题。 总的来说,"CXF2.6.4配java1.6版完整包和使用说明"是Java 1.6开发者构建Web服务的宝贵资源,提供了完整的...

    CXF-3.1.11jar包

    1. **SOAP支持**:CXF能够处理SOAP 1.1和1.2消息,支持WSDL(Web服务描述语言)的第一和第二版本,用于定义服务接口。 2. **RESTful服务**:除了传统的SOAP服务,CXF也支持Representational State Transfer(REST)...

    cxf与axis2区别

    Apache CXF目前暂不支持多语言,但能够与Spring进行无缝的整合,提供更加灵活的语言支持。 选择合适的框架 在选择webservices框架时,需要考虑以下几点: 1. 如果应用程序需要多语言的支持,Axis2应当是首选。 2....

    cxf框架包 apache-cxf-3.4.3.tar.gz

    CXF支持多种Web服务标准,如WS-I Basic Profile、WS-Security、WS-ReliableMessaging等,同时提供SOAP、RESTful API和JSON的支持。 **2. 版本3.4.3** Apache CXF 3.4.3是该框架的一个稳定版本,它修复了之前版本的...

    apache-cxf3.0

    2. **JAX-RS支持**:CXF也支持JAX-RS(Java API for RESTful Web Services),这使得开发RESTful服务变得简单。通过使用注解,如`@Path`、`@GET`、`@POST`等,开发者可以轻松地创建资源和操作。 3. **多种绑定机制*...

    cxf 3.1.1 jar包

    CXF的名字来源于"Code first"和"XML first",代表着它支持从Java代码或者XML定义来创建Web服务。CXF 3.1.1是该项目的一个特定版本,包含了对当时Web服务标准和协议的良好支持。 在描述中提到,你遇到了官方下载页面...

    apache-cxf-2.5.2

    4. **WSDL第一**和**代码第一**:CXF支持两种开发模式,即从WSDL文件生成Java代码(WSDL First)和从已有Java类生成WSDL(Code First)。 5. **客户端API**:CXF提供了一个强大的客户端API,使得调用Web服务变得...

    cxf源代码,样例,cxfdemo

    CXF不仅支持WSDL第一和WSDL第二风格的服务开发,还提供了丰富的API和工具来简化Web服务的实现。 【描述】"cxf服务端开发" 强调了CXF在构建服务端应用程序的核心功能。使用CXF,开发者可以轻松地实现WS-*规范(如...

    cxf-3.1.6的所需要的包

    1. **Web服务实现**:CXF支持JAX-WS(Java API for XML Web Services)标准,使开发者能够基于接口定义轻松地创建服务端和客户端。 2. **RESTful服务**:CXF同样支持JAX-RS(Java API for RESTful Web Services),...

    apache-cxf 2.2.8版本下载

    CXF支持多种Web服务标准,包括但不限于: 1. **SOAP (Simple Object Access Protocol)**:这是一种基于XML的协议,用于在分布式环境中交换结构化和类型化的信息。CXF支持SOAP 1.1和1.2版本。 2. **WSDL (Web ...

    cxf-3.0.0 zip

    11. **多语言支持**:虽然主要是Java框架,但CXF还支持其他编程语言,如Python,通过CXF4Python项目。 12. **持续集成**:"milestone2"表示这是该版本的第二个里程碑,通常在正式版本发布前,这些里程碑版本会经过...

Global site tag (gtag.js) - Google Analytics