日期:2014-05-17 浏览次数:20973 次
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