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