cxf不能将String的参数序列化的问题解决

问题:

java.lang.NoSuchMethodError: org.codehaus.jettison.AbstractXMLStreamWriter.serializeAsArray(Ljava/lang/String;)V
at org.apache.cxf.jaxrs.provider.json.utils.JSONUtils.createStreamWriter(JSONUtils.java:90)
at org.apache.cxf.jaxrs.provider.json.JSONProvider.createWriter(JSONProvider.java:507)
at org.apache.cxf.jaxrs.provider.json.JSONProvider.marshal(JSONProvider.java:477)
at org.apache.cxf.jaxrs.provider.json.JSONProvider.marshal(JSONProvider.java:527)
at org.apache.cxf.jaxrs.provider.json.JSONProvider.writeTo(JSONProvider.java:371)
at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.writeTo(JAXRSOutInterceptor.java:298)
at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:258)
at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:146)
at org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:84)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:211)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:213)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:154)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:130)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:221)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:197)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:617)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1760)
at java.lang.Thread.run(Thread.java:662)
2013-7-1 9:12:40 org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage
警告: Error serializing the response, please check the server logs, response class : Result.

解决:删除asm-3.1.jar、(另外删除jettison-1.1.jar、jettison-1.3.2.jar中的1.1)

cxf异常处理

在CXF中默认的异常处理是无法满足开发需求,经常需要把异常信息转换为JSON或者XML格式,返回给客户的,这样就只能自定义异常处理了。

在对外提供接口的时候,如果出现异常,一般会通过JSON或XML将异常码及异常信息反回给客户,这在CXF中也很容易实现。

第一步:编写自己的异常处理类 InvokeFaultExceptionMapper

  1. @Provider
  2. public class InvokeFaultExceptionMapper implements ExceptionMapper {
  3. public Response toResponse(Throwable ex) {
  4. StackTraceElement[] trace = new StackTraceElement[1];
  5. trace[0] = ex.getStackTrace()[0];
  6. ex.setStackTrace(trace);
  7. ResponseBuilder rb = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
  8. rb.type("application/json;charset=UTF-8");
  9. rb.entity(ex);
  10. rb.language(Locale.SIMPLIFIED_CHINESE);
  11. Response r = rb.build();
  12. return r;
  13. }
  14. }

第二部:加载InvokeFaultExceptionMapper

  1. <jaxrs:server id="expGateway" address="/expGateway">
  2. <jaxrs:inInterceptors>
  3. <ref bean="inMessageInterceptor"/>
  4. </jaxrs:inInterceptors>
  5. <jaxrs:outInterceptors>
  6. <ref bean="outMessageInterceptor"/>
  7. </jaxrs:outInterceptors>
  8. <jaxrs:serviceBeans>
  9. <ref bean="expGatewayImpl" />
  10. </jaxrs:serviceBeans>
  11. <jaxrs:extensionMappings>
  12. <entry key="json" value="application/json" />
  13. <entry key="xml" value="application/xml" />
  14. </jaxrs:extensionMappings>
  15. <jaxrs:languageMappings>
  16. <entry key="en" value="en-gb" />
  17. </jaxrs:languageMappings>
  18. <jaxrs:providers>
  19. <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
  20. <bean class="com.pml.service.outer.InvokeFaultExceptionMapper"/>
  21. </jaxrs:providers>
  22. </jaxrs:server>

CXF拦截器用法

http://yufenfei.iteye.com/blog/1688133

Apache CXF generates Number instead of String

You can add SimpleConverter to your JSONProvider so that it will not convert strings to numbers. By Default it uses DefaultConverter. But make sure that relevant bean as type string for the field.

 <bean id="simpleConverter" class="org.codehaus.jettison.mapped.SimpleConverter"/>

 <bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
<property name="typeConverter" ref="simpleConverter"/>
</bean>
You can find more information about this defect in Jettison http://jira.codehaus.org/browse/JETTISON-61http://jira.codehaus.org/browse/JETTISON-36

 cxf 请求参数为json不带类名头不识别的问题解决

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util" 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:cxf="http://cxf.apache.org/core" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-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://cxf.apache.org/core
http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd"> <bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> <util:list id="jsonKeys">
<value>app</value>
<value>comment</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="dropRootElement" value="true" /> <property
name="dropCollectionWrapperElement" value="true" /> <property
name="supportUnwrapped" value="true" /> <property
name="serializeAsArray" value="true" /> <property
name="attributesToElements" value="true"/>
-->
<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="dropCollectionWrapperElement" value="true" />
<property name="ignoreMixedContent" value="true" />
<property name="supportUnwrapped" value="true" />
<property name="attributesToElements" value="true" />
</bean>

REFERENCES:http://hdxiong.iteye.com/blog/1752036

http://stackoverflow.com/questions/10895982/apache-cxf-generates-number-instead-of-string

http://yufenfei.iteye.com/blog/1717098

cxf 相关问题的更多相关文章

  1. [Cxf] cxf 相关知识整理

    ① 请求方式为GET @GET @Path(value = "/userAddressManage") @Produces( { MediaType.APPLICATION_JSO ...

  2. osgi应用使用桥接的方式打成war包部署在websphere上时遇到的与cxf相关的问题

    原来我们的程序都是基于Equinox架构的,可是后面由于要实现打成war包在中间件中部署的需求,使用了eclipse官方提供的桥接方式实现. 桥接的部分后面有时间了我专门写一个文章来说,不明确的临时请 ...

  3. webservice CXF 相关面试题

    Web Service的优点(1) 可以让异构的程序相互访问(跨平台)(2) 松耦合(3) 基于标准协议(通用语言,允许其他程序访问) 1:WEB SERVICE名词解释.JSWDL开发包的介绍.JA ...

  4. Spring 4 集成Apache CXF开发JAX-RS Web Service

    什么是JAX-RS 在JSR-311规范中定义,即Java API for RESTful Web Services,一套Java API,用于开发 RESTful风格的Webservice. 工程概 ...

  5. CXF发布webService服务以及客户端调用

    这篇随笔内容是CXF发布webService服务以及客户端调用的方法 CXF是什么? 开发工作之前需要下载CXF和安装 下载地址:http://cxf.apache.org 安装过程: <1&g ...

  6. 【转】基于CXF Java 搭建Web Service (Restful Web Service与基于SOAP的Web Service混合方案)

    转载:http://www.cnblogs.com/windwithlife/archive/2013/03/03/2942157.html 一,选择一个合适的,Web开发环境: 我选择的是Eclip ...

  7. Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service

    准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并 ...

  8. CXF整合Spring发布WebService实例

    一.说明: 上一篇简单介绍了CXF以及如何使用CXF来发布一个简单的WebService服务,并且介绍了客户端的调用. 这一篇介绍如何使用CXF与spring在Web项目中来发布WebService服 ...

  9. 使用CXF暴露您的REST服务

    使用CXF暴露您的REST服务 REST应用服务器SpringBeanServlet  1.  前言 现在互联网Open API流行,将您的Web应用也可以开放Open API给其他第三方使用.达到一 ...

随机推荐

  1. [转载]DB2与ORACLE、MYSQL比较2

    原文地址:DB2与ORACLE.MYSQL比较2作者:欣颖 4.2 Oracle9i  Oracle的产品战略是每12到18个月发布一个主要版本.主要发行版本所遵循的命名战略在PC领域中更为常见,它不 ...

  2. JavaScript Cookies,创建,获取cookies value

    什么是cookie? cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 来创建和取回 cookie ...

  3. ROS学习(十三)—— 编写简单的Service和Client (C++)

    一.编写Service节点 1.节点功能: 我们将创建一个简单的service节点("add_two_ints_server"),该节点将接收到两个整形数字,并返回它们的和. 2. ...

  4. 简单的zip压缩和解压缩

    其实像这样的php拓展很多,只是项目中没怎么用到: <?php $zip = new ZipArchive(); $filename = "./test112.zip"; / ...

  5. React(0.13) 服务端渲染的两个函数

    1.React.renderToString 函数,  参数是组件,返回一个字符串 <!DOCTYPE html> <html> <head> <title& ...

  6. Xcode 常用插件

    1.Xcode 插件 从 Xcode 8 起 Apple 禁用 Xcode 插件. 1)Xcode 插件安装目录 ~/library/Application Support/Developer/Sha ...

  7. [转]PhotoshopCS5 Extended使用atmlib.dll破解注册后没有3D菜单之解决方法

    PS CS5分标准版和扩展版,扩展版有包括3D的所有功能理论上Adobe CS5 大师版的PS应该是扩展版的,但是某些童鞋可能会遇到安装好大师版后输入key后,PS再打开“3D选项”没有了.也就是说有 ...

  8. sql server 2008评估期已到的解决办法

    点击开始-所有程序-Microsoft SQL Server 2008-配置工具-SQL Server 安装中心然后点击左侧的维护,在点击右侧的版本升级,接着按照提示一直点下一步,到产品密钥的时候输入 ...

  9. Python读文本文件

    file_object = open('thefile.txt') try: all_the_text = file_object.read() finally: file_object.close( ...

  10. 【转】标准C++类std::string的内存共享和Copy-On-Write技术

    1.             概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功 ...