日期:2014-05-17 浏览次数:21006 次
Rest 方法简洁得令人抓狂,必须得把现有的 service 封装成 REST 方式。 Apache CXF 是不二之选。
?
计划一下内容:
(1)了解 CXF;
(2)下载 CXF;
(3)集成现有环境;
(4)封装 PhotoService 试试;
(5)前端调用一下下。
?
一、了解CXF
引用http://www.iteye.com/topic/424737
?
?
?
?二、下载
完成这件事最没有技术含量了。http://cxf.apache.org/download.html
?
三、集成现有环境
?
四、封装 PhotoService 试试
?
五、前端调用一下下
http://www.yoxigen.com/yoxview/
?
六、问题汇总
(1)JSONProvider 检查
?
<!-- custom JSONProvider with serializeAsArray to force arrays when only one item exists in a collection --> <bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider"> <property name="serializeAsArray" value="true"/> <property name="arrayKeys" ref="jsonKeys"/> </bean> ... <bean id="streamingServiceImpl" class="com.plusrun.apps.streaming.rest.impl.StreamingServiceImpl" parent="remoteSupport"> </bean> <jaxrs:server id="streamingService" address="/v2/rest/activity-stream"> <jaxrs:serviceBeans> <ref bean="streamingServiceImpl"/> </jaxrs:serviceBeans> <jaxrs:providers> <ref bean="jsonProvider"/> </jaxrs:providers> </jaxrs:server>
?
?? ?可以在扩展?JSONProvider 的方法中检查钓鱼方法
?
?
public void writeTo(Object obj, Class<?> cls, Type genericType, Annotation[] anns, MediaType m, MultivaluedMap<String, Object> headers, OutputStream os) throws IOException { if ("GET".equalsIgnoreCase(this.request.getMethod())) { os.write("不支持浏览器 GET 方法".getBytes()); os.flush(); } super.writeTo(obj, cls, genericType, anns, m, headers, os); }
?
?
(2)输出 Java List 对象的时候,如果结果集是一条记录时,输出到 XML 和 JSON 都不是数组;如果结果集是两条以上的时候,输出的 XML 就自动变成数组。NND 给前端造成极大的困惑,搞了两小时,才整明白,JAXB 输出 XML 时,对 LIST 支持不太好。
解决方法:定义 arrayKeys
?
?
<util:list id="jsonKeys"> <value>Users</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.JSONProvider"> <prop