- 浏览: 225255 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (212)
- 架构师-01-文档目录 (3)
- 架构师-02-组织 (7)
- 架构师-03-实施 (35)
- 架构师-04-监督 (14)
- 架构师-05-工具 (29)
- 架构师-09-引用文集 (63)
- 专题-01-微博应用 (5)
- 专题-02-GoogleEarth (1)
- 专题-03-运行维护 (9)
- 专题-04-经纪人营平 (3)
- 专题-05-RCP&RAP (5)
- 专题-06-框架PK (3)
- 专题-07-Android (13)
- 专题-08-UI (3)
- 专题-liferay6 (6)
- 专题-extjs4 (3)
- 专题-CXF (3)
- 专题-封闭网络的社会化 (0)
- 扯谈 (4)
- 外包 (9)
- 专题-C++ (4)
- 专题-09-BI (2)
- jquery&easyui (2)
- 专题-搜索引擎 (1)
最新评论
-
brighter:
oMapper.configure(Deserializati ...
jackson 抛出 bean 中没有定义字段的错误,只好用 gson -
PassFeed_free:
public Bitmap decode(ImageDecod ...
android universalimageloader 几点改进 -
PassFeed_free:
楼主你好, 请问这个库, 在大屏显示高清图片 ,listvie ...
android universalimageloader 几点改进 -
yonghong:
楼主只是揣测
JIRA4.1 升级到 JIRA5.1 -
abdxj:
"Could NOT parse license t ...
JIRA4.1 升级到 JIRA5.1
问题:CXF 结合jaxb返回json字符串时,当属性为数值型字符串时,没有双引号问题。
这个问题应该是影响比较大的,网上的资料并不多,其中比较有帮助的是 http://fly2wind.iteye.com/blog/730350
写道
CXF,RESTEASY返回格式为JSON时,如果类型为String的值为数值时,JSON中引号消失的问题解决
要解决这个问题,需要修改相关的底层代码:
是的,整个转换过程是 Object->XML-JSON, Object到 XML转换过程中,类型会丢失
不得不同意,JavaBean 转 XML后 再转JSON,会丢失类型,作为 org.codehaus.jettison.mapped.DefaultConverter 采取的补救措施是,将数字转为数字类型,但也会秒杀了字符型且值为数字的对象。
作为解决方案,这个思路是很好的,先将字符串加个特殊标志,然后再用转换器去掉特殊标志。
但大多数人都会认会需要改底层代码比较不现实,有没有一种方式更安全一些。
这几天我也作了一些尝试,比如按网友的说法,改了 JAXB 的底层,配置了转换器,也能成功地跑出结果,但更大的杯具发生了。这个方法只能将根一级的变量值返回正确,如果是javaBean 中的变量是引用的其他Bean,列表... 都不能正确得到结果。
我也采用了扩展一个新的 JSONProvider,JAXBElementProvider ,预先递归将字符全部加上特殊标志,或许能得到正确的结果。
但这些方法或许不是最好。
终于有比较简洁的方法:
以 CXF 为例,配置文件。
<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider"> <property name="serializeAsArray" value="true"/> <property name="arrayKeys" ref="jsonKeys"/> <property name="produceMediaTypes" ref="jsonTypes"/> <property name="consumeMediaTypes" ref="jsonTypes"/> <property name="ignoreNamespaces" value="true"/> <property name="dropRootElement" value="true"/> <property name="ignoreMixedContent" value="true"/> <property name="attributesToElements" value="true"/> </bean>
给 JavaBean 的字符型变量中加多一个声明: @XmlAttribute
/** * 留言标题/短内容. * Field: subject */ @Size(max = 32) @XmlAttribute private java.lang.String subject; /** * 留言主体/长内容. * Field: body */ @Size(max = 255) @XmlAttribute private java.lang.String body;
这样就能得到想要的结果了,多少层级引用的对象都可以。
{ "msg": "OK", "ret": 0, "err": 0, "message": { "subject": "1", "body": "1", "id": 423, "userId": 1, "clientVersion": 1, "sentId": 1, "receiptId": 1, "threadId": 275, "status": 0, "creationDate": 1338361215759, "modificationDate": 1338361215759, "usn": 710 } }
完整 cxf 配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <util:list id="jsonKeys"> <value>forumThreads</value> <value>forumMessages</value> <value>forumUserStatis</value> </util:list> <util:list id="jsonTypes"> <value>application/json</value> <value>application/jettison</value> </util:list> <bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider"> <property name="serializeAsArray" value="true"/> <property name="arrayKeys" ref="jsonKeys"/> <property name="produceMediaTypes" ref="jsonTypes"/> <property name="consumeMediaTypes" ref="jsonTypes"/> <property name="ignoreNamespaces" value="true"/> <property name="dropRootElement" value="true"/> <property name="ignoreMixedContent" value="true"/> <property name="attributesToElements" value="true"/> </bean> <jaxrs:server id="restApiResource" address="/"> <jaxrs:serviceBeans> <!-- <ref bean="userAuthServiceResource"/> <ref bean="syncServiceResource"/> <ref bean="imageServiceResource"/> <ref bean="messageServiceResource"/> <ref bean="upgradeServiceResource"/> --> </jaxrs:serviceBeans> <jaxrs:providers> <ref bean="jsonProvider"/> </jaxrs:providers> <jaxrs:extensionMappings> <entry key="json" value="application/json"/> <entry key="xml" value="application/xml"/> </jaxrs:extensionMappings> </jaxrs:server> </beans>
评论
7 楼
tstext
2012-09-06
我网页显示出json结果,也会多了个@,绝对的加了
<property name="attributesToElements" value="true"/> 的
<property name="attributesToElements" value="true"/> 的
6 楼
tstext
2012-06-19
attributesToElements 这个不是一个方法吗,看类JSONProvider里面并没有这个方法呀?
5 楼
cnmqw
2012-06-10
dingding5060 写道
在你的另外一篇博客中看到应该
...
id是HelloWorld继承父类的属性,居然多了一个@符号,奇怪。addrID也还是没有引号,是不是我配置出问题了?
...
id是HelloWorld继承父类的属性,居然多了一个@符号,奇怪。addrID也还是没有引号,是不是我配置出问题了?
须加上上面配置文件中最关键的一句
<property name="attributesToElements" value="true"/>
4 楼
dingding5060
2012-06-04
在你的另外一篇博客中看到应该
1.<util:list id="jsonKeys">
2. <value>Users</value>
3.</util:list>
4.
5.<util:list id="jsonTypes">
6. <value>application/json</value>
7. <value>application/jettison</value>
8.</util:list>
我的spring版本找不到util:list ,我改为了
<bean id="jsonKeys" class="java.util.ArrayList">
<constructor-arg>
<list>
<value>addresses</value>
</list>
</constructor-arg>
</bean>
效果为
{"helloWorld":{"@id":"123","addresses":{"addrID":2345,"name":"shenzhen"},"message":"Hello world rest and soap!!queryHello!--->queryHello00002"}}
HelloWorld属性的get方法上面加了@XmlAttribute
id是HelloWorld继承父类的属性,居然多了一个@符号,奇怪。addrID也还是没有引号,是不是我配置出问题了?
1.<util:list id="jsonKeys">
2. <value>Users</value>
3.</util:list>
4.
5.<util:list id="jsonTypes">
6. <value>application/json</value>
7. <value>application/jettison</value>
8.</util:list>
我的spring版本找不到util:list ,我改为了
<bean id="jsonKeys" class="java.util.ArrayList">
<constructor-arg>
<list>
<value>addresses</value>
</list>
</constructor-arg>
</bean>
效果为
{"helloWorld":{"@id":"123","addresses":{"addrID":2345,"name":"shenzhen"},"message":"Hello world rest and soap!!queryHello!--->queryHello00002"}}
HelloWorld属性的get方法上面加了@XmlAttribute
id是HelloWorld继承父类的属性,居然多了一个@符号,奇怪。addrID也还是没有引号,是不是我配置出问题了?
3 楼
dingding5060
2012-06-04
我的
cxf版本是2.6.0
jaxb版本是2.2.5
spring版本是3.0
cxf版本是2.6.0
jaxb版本是2.2.5
spring版本是3.0
2 楼
dingding5060
2012-06-04
信息: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@f4ca49: defining beans [cxf,org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor,org.apache.cxf.bus.spring.Jsr250BeanPostProcessor,org.apache.cxf.bus.spring.BusExtensionPostProcessor,org.apache.cxf.binding.soap.SoapBindingFactory,org.apache.cxf.binding.soap.SoapTransportFactory,org.apache.cxf.binding.soap.customEditorConfigurer,cxf.config0,helloWorldService,restServer,jaxbBean,jaxws-and-aegis-service-factory,helloWorldServiceEndpoint,jsonProvider,loggingInInterceptor,inInterceptor,outInterceptor,loggingOutInterceptor,cxf.config1]; root of factory hierarchy
2012-6-4 18:42:14 org.springframework.web.context.ContextLoader initWebApplicationContext
严重: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jsonProvider' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'jsonKeys' while setting bean property 'arrayKeys'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'jsonKeys' is defined
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
2012-6-4 18:42:14 org.springframework.web.context.ContextLoader initWebApplicationContext
严重: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jsonProvider' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'jsonKeys' while setting bean property 'arrayKeys'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'jsonKeys' is defined
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
1 楼
dingding5060
2012-06-04
非常感谢楼主的分享,不过请问下:
arrayKeys、produceMediaTypes、consumeMediaTypes分别映射的jsonKeys和jsonTypes分别是什么啊?因为我这样配置后启动报错:
arrayKeys、produceMediaTypes、consumeMediaTypes分别映射的jsonKeys和jsonTypes分别是什么啊?因为我这样配置后启动报错:
发表评论
-
集成Hibernate Search做全文检索
2014-05-03 15:42 539集成Hibernate Search做全文检索 原文来自 h ... -
cxf 用 jackson 似乎好太多了
2014-05-03 03:44 772用 cxf 默认的 jettsion 方式转 json,有 ... -
jackson 抛出 bean 中没有定义字段的错误,只好用 gson
2012-12-11 17:01 1043Jackson可以轻松的将Java对象转换成json对象和xm ... -
Base64扩展,自定义字串和顺序
2012-12-06 11:10 1676Base64很标准,sun 的 jdk 包含了实现,JS ... -
避免跨域问题 ajax proxy
2012-12-04 09:31 818前端全是 AJAX 框架,其中用到一些动态 API 调用,动静 ... -
Arc-03-32 用户事件跟踪
2012-07-05 15:25 729参照 clickstream 项目,保存到数据库 1.实现原 ... -
Arc-03-30-Postgresql 数据导出到Sqlite
2012-05-15 09:39 0用了空间数据库 PostGis,所以用了 Postgresql ... -
extjs4 有用的资源链接
2012-05-12 01:07 659对 Ext 扩展的一些小总结 http://laodaoba ... -
Arc-03-29 CXF 实现 REST 方式上传文件
2012-04-09 00:46 3069CXF 实现 REST 方式上传文件 /** ... -
Arch-03-28 Jndi 配置 Mongodb jetty 实现
2012-03-06 15:20 1622使用 springdata mongodb,直接使用 spri ... -
Arc-03-27-FTP 服务和客户端小结
2012-01-29 18:08 772尽管局域网中传输文件有 n 多方法,samba,webdav, ... -
Arc-03-26-相册图片短码编码实现
2011-12-29 17:01 911应用中需要上传用户图片,不想数据库单独维护图片的信息,想直接从 ... -
Arch-03-25-JAVA异常列表
2011-12-20 09:37 916ClassCastException 类型转换异常类 ... -
Arch-03-24- Spring Security 应用
2011-11-08 17:47 1434Spring Security 用了几次,还没有在集群环境中使 ... -
Arch-03-23- ActiveMQ 实践
2011-10-28 15:03 823ActiveMQ 到了非用不可的地步了,学习一下吧。主要用途定 ... -
Arch-03-22- 编程实现多数据源,水平切分,异种数据源
2011-10-20 17:35 815在 Spring 的框架下,通过编程实现多数据源(JDBC), ... -
Arch-03-21- Spring 中调用 Guice 中的注入
2011-10-06 20:27 881当 spring 和 guice 共同存在一个项目中,且 sp ... -
Arch-03-20- Shindig 实践
2011-10-06 16:53 779之前已经抄录了几篇网文,初步了解 shindig 功能与特性, ... -
Arch-03-19- NoSQL实践
2011-09-26 10:27 1333虽然对新技术甚为谨慎,但目前大家所做的伪 sns 的 nosq ... -
Arch-03-18- 用 Mysql-proxy 搭建 MySQL 集群
2011-09-20 10:21 882对应上篇 pgpool2 搭建 postgresql 集群,因 ...
相关推荐
然而,当JSON中的字符串值实际上代表数字时,可能会出现一个特殊问题:JSON解析器会尝试将这些字符串转换为数值类型,导致原本应被引号包围的字符串丢失引号。这个问题通常发生在JSON序列化过程中,即从Java对象转化...
在处理CXF与JAXB的集成时,有时会遇到版本冲突的问题,特别是在处理Web服务时,这些问题可能会导致应用程序运行异常。 本文将深入探讨如何解决CXF与JAXB版本冲突,以及如何处理Java.lang.LinkageError,特别是当...
通过Apache CXF框架创建Web服务,并结合Spring框架进行管理,从而能够灵活地返回不同类型的数据,包括List、自定义Bean对象、纯文本String以及常见的数据交换格式JSON和XML。这种集成方式使得服务端能够更加便捷地...
例如,使用POST方法发送JSON数据到服务器,CXF会自动将JSON字符串转换为Java对象。 6. CXF客户端调用 对于CXF客户端,可以使用`javax.ws.rs.client.ClientBuilder`创建一个客户端实例,然后通过`target()`方法指定...
CXF提供了一种名为Jettison的插件,使得服务可以返回JSON格式的数据。使用`@Produces("application/json")`注解可以声明服务方法将返回JSON。 示例: ```java @WebService @Produces("application/json") ...
本实例工程使用Apache CXF组件快速开发WebService。基于Spring框架,使用了Maven项目,但由于时间原因,只使用了Maven Project的框架,还是使用lib文件夹存放所需的cxf库,传入传出对象支持Json格式。
发布CXF+Spring整合的REST的服务接口完整实例,其中包括数据库连接池,json数据格式传递数据,HttpURLConne的get和post方式调用接口,以及获取访问者ip地址工具类等众多的技术实例。
开发JAR包集合-cxf/dom4j/jaxb/json/jta/jxl 解压文件得到如下jar包 cxf-2.2.8.jar dom4j-1.6.1.jar ehcache-core-2.2.0.jar jaxb-api-2.2.jar jaxb-impl-2.2.jar json-lib-2.4-jdk15.jar json-lib-ext-...
Gson是Google提供的一个Java库,能够将Java对象转换为JSON字符串,反之也能将JSON文本解析为等效的Java对象。在CXF服务中,Gson可以帮助我们将Java对象序列化为JSON,以便通过HTTP传输,或者反序列化接收到的JSON...
CXF发布的REST服务返回JSON格式数据,只有服务端代码,没有客户端代码,可以通过http://localhost:9999/roomservice/room、http://localhost:9999/roomservice/room/001来访问测试数据。
赠送jar包:cxf-rt-databinding-jaxb-3.0.1.jar; 赠送原API文档:cxf-rt-databinding-jaxb-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-databinding-jaxb-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-...
在"Apache CXF + Spring3 + REST + JSON配置"中,我们主要探讨如何利用Apache CXF和Spring 3框架来构建RESTful服务,并使用JSON作为数据交换格式。以下是一些关键知识点: 1. **Spring 3集成CXF**: - 首先,你...
这里使用了Gson库将字符串转换为JSON格式。当然,也可以选择Jackson或其他库进行JSON序列化。 为了测试这个接口,你可以使用curl命令或浏览器插件发送HTTP请求到`http://localhost:8080/services/hello`。如果一切...
CXF集成了JAXB,使得在处理XML消息时,无需编写大量的转换代码。 在提供的压缩包“ws_test”中,很可能包含了使用CXF实现的Web服务示例,包括JAX-WS和JAX-RS的服务端点,以及使用JAXB进行数据交换的类。这个实例...
1. JSON解析库:如org.json或com.google.gson等,这些库提供了方便的API,用于将JSON字符串转换为Java对象,反之亦然。例如,org.json中的JSONObject和JSONArray类可以用于解析和构建JSON数据。 2. CXF核心库:CXF...
本文将详细探讨如何使用CXF 2.6版本与Spring框架结合,来提供REST服务并输出XML或JSON格式的数据。 首先,我们需要理解CXF的核心概念。CXF全称是Camel eXtended for Web Services,它提供了全面的Web服务实现,包括...
然而,在使用CXF时,可能会遇到各种编码问题,特别是当处理非ASCII字符集,如GBK时。本篇将深入探讨"cxf3.2.0编码GBK的不可映射字符问题",并提供解决方案。 在Java中,默认的字符编码是UTF-8,而GBK是一个中文常用...
**冲突解决** 当使用CXF框架并遇到与JDK 6内置JAXB库的冲突时,可以通过引入外部的`jaxb-api.jar`和`jaxws-api.jar`来解决。这两个jar文件提供了与CXF兼容的JAXB和JAX-WS实现,避免了与系统默认库的冲突。 **...
**标题:“cxf-webservice复杂类型”** 在Web服务领域,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费各种类型的Web服务,包括处理复杂的类型数据。本主题将深入探讨CXF如何处理像Map这样的Java集合...