在使用CXF或RESTEASY等框架构建REST方式的WEB SERVICE的应用时候
如:
使用JAXB注解定义一个返回的对象
@XmlRootElement(name = "user")
@XmlType(propOrder = { "id", "nickName", "signature", "birthday", "gender" })
@XmlAccessorType(XmlAccessType.FIELD)
public class GetResponse {
private Long id;
private String nickName;
...
当返回格式为JSON的时候,如果nickName的值是12345,则返回的JSON内容为:
{"id":1,"nickName":12345}
按理说json的内容应该为:
{"id":1,"nickName":"12345"}
12345应该有引号。
要解决这个问题,需要修改相关的底层代码:
//修改com.sun.xml.bind.v2.runtime.XMLSerializer.java
public void leafElement(Name tagName, String data, String fieldName) throws SAXException, IOException, XMLStreamException {
Object currentObj = cycleDetectionStack.peek();
if (out instanceof com.sun.xml.bind.v2.runtime.output.XMLStreamWriterOutput) { //判断out的类型,XMLStreamWriterOutput为json或其他非xml格式的writer
Field field = null;
try {
field = currentObj.getClass().getDeclaredField(fieldName);
} catch (Exception e1) {
try {
field = currentObj.getClass().getField(fieldName);
} catch (Exception e2) {
} 取的当前字段的类型信息
}
if (field != null && field.getType().getName().equals("java.lang.String")) { //如果为字符串并且字符串为数字格式,增加标记 $:
if (isNumber(data)) {
data = "$:" + data;
}
}
}
....
//修改org.codehaus.jettison.mapped.DefaultConverter.java或自己定义一个实现
public Object convertToJSONPrimitive(String text) {
if (text == null)
return text;
Object primitive = null;
// Attempt to convert to Integer
//----------------------------数值类型字符串不能正确转换的元凶在这里
try {
primitive = ENFORCE_32BIT_INTEGER ? Integer.valueOf(text) : Long.valueOf(text);
} catch (Exception e) {/**/
}
// Attempt to convert to double
if (primitive == null) {
try {
Double v = Double.valueOf(text);
if (!v.isInfinite() && !v.isNaN()) {
primitive = v;
} else {
primitive = text;
}
} catch (Exception e) {/**/
}
}
// Attempt to convert to boolean
if (primitive == null) {
if (text.trim().equalsIgnoreCase("true") || text.trim().equalsIgnoreCase("false")) {
primitive = Boolean.valueOf(text);
}
}
if (primitive == null || !primitive.toString().equals(text)) {
// Default String
if (text.startsWith("$:")) { //如果字符串含有标记,去掉标记
text = text.substring(2);
}
primitive = text;
}
return primitive;
}
分享到:
相关推荐
在处理JSON数据时,可能会遇到格式错误、类型转换异常等问题,需要进行适当的错误处理。CXF提供了异常映射机制,可以将服务端的异常转换为对应的HTTP状态码和错误消息。 总结,Apache CXF结合JSON为开发者提供了...
CXF提供了一种名为Jettison的插件,使得服务可以返回JSON格式的数据。使用`@Produces("application/json")`注解可以声明服务方法将返回JSON。 示例: ```java @WebService @Produces("application/json") ...
CXF发布的REST服务返回JSON格式数据,只有服务端代码,没有客户端代码,可以通过http://localhost:9999/roomservice/room、http://localhost:9999/roomservice/room/001来访问测试数据。
本项目旨在展示如何在Java企业级应用(Java EE)中,通过Apache CXF框架创建Web服务,并结合Spring框架进行管理,从而能够灵活地返回不同类型的数据,包括List、自定义Bean对象、纯文本String以及常见的数据交换格式...
在这个场景中,CXF被用来作为客户端和服务端之间交换JSON格式数据的工具。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和生成,而被广泛用于网络通信...
在这个例子中,`@Path`注解定义了服务的URL路径,`@GET`表示这是一个GET请求,`@Produces`指定了可以返回的媒体类型(XML和JSON)。在实现类中,你需要创建一个Person对象并转换为XML或JSON格式。CXF会自动处理这些...
在本示例中,我们将探讨如何使用Apache CXF来提供JSON格式的接口服务。 首先,让我们了解CXF的关键组件。CXF包括一个SOAP处理器,用于处理SOAP消息,以及一个RESTful处理器,用于处理RESTful(基于HTTP协议的JSON或...
当我们需要在Web服务中同时处理JSON和XML数据格式时,CXF和Spring的整合就显得尤为重要。 首先,我们需要在项目中引入CXF和Spring的相关依赖。这通常通过Maven或Gradle的配置文件来完成,添加对应的库,如`cxf-rt-...
在"Apache CXF + Spring3 + REST + JSON配置"中,我们主要探讨如何利用Apache CXF和Spring 3框架来构建RESTful服务,并使用JSON作为数据交换格式。以下是一些关键知识点: 1. **Spring 3集成CXF**: - 首先,你...
本实例工程使用Apache CXF组件快速开发WebService。基于Spring框架,使用了Maven项目,但由于时间原因,只使用了Maven Project的框架,还是使用lib文件夹存放所需的cxf库,传入传出对象支持Json格式。
本项目主要展示了如何使用CXF和Spring构建一个能够以JSON格式返回数据的RESTful WebService接口。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它...
发布CXF+Spring整合的REST的服务接口完整实例,其中包括数据库连接池,json数据格式传递数据,HttpURLConne的get和post方式调用接口,以及获取访问者ip地址工具类等众多的技术实例。
例如,如果CXF服务配置为接收GBK编码,但客户端发送的是UTF-8编码的数据,解析时就会出现问题。 2. **XML文档编码**:CXF作为基于SOAP的服务,很多交互都是通过XML进行的。XML文件头通常会声明其编码,如`...
同样,如果服务返回一个产品列表,CXF会将Java List对象转换为XML格式的数组,方便客户端解析。 在实际应用中,我们需要在CXF服务端创建服务接口和实现,然后通过JAXB(Java Architecture for XML Binding)进行...
在这个“CXF整合spring 支持restful xml json 上传下载的HelloWorld”示例中,我们将探讨如何实现XML和JSON数据格式的支持,以及文件上传和下载功能。 首先,我们需要在Spring配置文件中声明CXF的Servlet,这样可以...
cxf&spring;&json;&xml;所需要的jar包和实例
4. JSON与CXF交互的库:如果你需要在Web服务中使用JSON,可能还需要额外的库,如cxf-rt-features-json,它提供了JSON数据格式的支持。 在"lib"这个压缩包文件中,你应该找到了所有这些必要的jar包。在Java项目中,...
当CXF客户端在与服务器交互时,如果服务器返回的响应或请求的数据中包含非GBK字符,而客户端默认使用GBK编码解析,就会出现乱码或者无法解析的情况。 为了解决这个问题,我们需要理解并正确配置CXF的字符编码策略。...