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
- @Provider
- public class InvokeFaultExceptionMapper implements ExceptionMapper {
- public Response toResponse(Throwable ex) {
- StackTraceElement[] trace = new StackTraceElement[1];
- trace[0] = ex.getStackTrace()[0];
- ex.setStackTrace(trace);
- ResponseBuilder rb = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
- rb.type("application/json;charset=UTF-8");
- rb.entity(ex);
- rb.language(Locale.SIMPLIFIED_CHINESE);
- Response r = rb.build();
- return r;
- }
- }
第二部:加載InvokeFaultExceptionMapper
- <jaxrs:server id="expGateway" address="/expGateway">
- <jaxrs:inInterceptors>
- <ref bean="inMessageInterceptor"/>
- </jaxrs:inInterceptors>
- <jaxrs:outInterceptors>
- <ref bean="outMessageInterceptor"/>
- </jaxrs:outInterceptors>
- <jaxrs:serviceBeans>
- <ref bean="expGatewayImpl" />
- </jaxrs:serviceBeans>
- <jaxrs:extensionMappings>
- <entry key="json" value="application/json" />
- <entry key="xml" value="application/xml" />
- </jaxrs:extensionMappings>
- <jaxrs:languageMappings>
- <entry key="en" value="en-gb" />
- </jaxrs:languageMappings>
- <jaxrs:providers>
- <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
- <bean class="com.pml.service.outer.InvokeFaultExceptionMapper"/>
- </jaxrs:providers>
- </jaxrs:server>
CXF攔截器用法
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.

1 <bean id="simpleConverter" class="org.codehaus.jettison.mapped.SimpleConverter"/> 2 3 <bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider"> 4 <property name="typeConverter" ref="simpleConverter"/> 5 </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