`
hdxiong
  • 浏览: 376429 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SPRING-REST和CXF-REST实现过程中的系列问题

    博客分类:
  • Java
 
阅读更多
1、mybatis 数字用$,字符用#

2、cxf 关于JSONProvider 返回单个对象数组的问题。
app-rest.xml配置
<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:jaxrs="http://cxf.apache.org/jaxrs"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/util
	http://www.springframework.org/schema/util/spring-util.xsd
	http://cxf.apache.org/jaxrs
	http://cxf.apache.org/schemas/jaxrs.xsd
	http://cxf.apache.org/core 
	http://cxf.apache.org/schemas/core.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" />

	<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.JSONProvider">
		<property name="arrayKeys" ref="jsonKeys" />
		<property name="serializeAsArray" value="true" />
		<property name="produceMediaTypes" ref="jsonTypes" />
		<property name="consumeMediaTypes" ref="jsonTypes" />
	</bean>

	<jaxrs:server id="commonsService" address="/">
		<jaxrs:extensionMappings>
			<entry key="json" value="application/json" />
			<entry key="xml" value="application/xml" />
		</jaxrs:extensionMappings>
		<jaxrs:serviceBeans>
			<ref bean="commentsServiceImpl" />
			<ref bean="userServiceImpl" />
			<ref bean="postServiceImpl" />
			<ref bean="contentRestImpl" />
			<ref bean="collectListRestImpl" />
			<ref bean="downloadListRestImpl" />
			<ref bean="rankServiceRestImpl" />
			<ref bean="appAddImpl" />
			<ref bean="appPush" />
		</jaxrs:serviceBeans>
		<jaxrs:providers>
			<ref bean="jsonProvider" />
		</jaxrs:providers>
	</jaxrs:server>
</beans>

javabean代码
import java.io.Serializable;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

import sgh.comment.base.model.Comments;

//评论列表
@XmlAccessorType(XmlAccessType.FIELD)
public class CommentsResult implements Serializable {

	private static final long serialVersionUID = -6304211106650057160L;

	/**
	 * 总条数
	 */
	public Integer totalCount;
	
	/**
	 * 总页数
	 */
	public Integer totalPage;
	
	/**
	 * APP评论
	 */
	@XmlElement(name="comment")
	public List<Comments> commentList;
}

相关源代码参见截图:



备注:
a.arrayKeys和serializeAsArray组合使用,serializeAsArray=true表示arrayKeys中提到的属性值都以数组形式返回,解决单条数据不以数组形式返回的问题。
b.arrayKeys是值需要以数组形式返回的属性名字。如上是comment而不是commentList。

4、cxf关于数字类型的字符串自动被去掉引号的问题。
具体原因参见:org.codehaus.jettison.mapped.DefaultConverter和org.codehaus.jettison.mapped.SimpleConverter
方法1:SimpleConverter的实现去重写DefaultConverter。
方法2:修改配置使其默认用SimpleConverter即可。具体怎么配置目前还不知道。

5、spring mvc rest空对象也被返回的问题。
<property name="defaultViews">
	<list>
		<!-- for application/json -->
		<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
			<!-- 重新设置 objectMapper -->
			<property name="objectMapper">
				<bean class="org.codehaus.jackson.map.ObjectMapper">
					<!-- 设置objectMapper的serializationConfig的serializationInclusion属性,以忽略null对象 ,也可在vo上注解@JsonWriteNullProperties(false)-->
					<property name="serializationConfig.serializationInclusion">
						<value type="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion">NON_NULL</value>
					</property>
				</bean>
			</property>
		</bean>
		
		<!-- for application/jsonp -->
		<bean class="org.springframework.web.servlet.view.jsonp.MappingJacksonJsonpView">
			<!-- 重新设置 objectMapper -->
			<property name="objectMapper">
				<bean class="org.codehaus.jackson.map.ObjectMapper">
					<!-- 设置objectMapper的serializationConfig的serializationInclusion属性,以忽略null对象 ,也可在vo上注解@JsonWriteNullProperties(false)-->
					<property name="serializationConfig.serializationInclusion">
						<value type="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion">NON_NULL</value>
					</property>
				</bean>
			</property>
		</bean>
		
		<!-- for application/xml -->
		<!-- 
		<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
			<property name="marshaller" ref="castorMarshaller" />
		</bean>
		-->
	</list>
</property>


6、spring mvc rest支持jsonp的问题。
<!-- 设置为true以忽略对Accept Header的支持,默认false -->
<property name="ignoreAcceptHeader" value="false" />
<!-- 设置为true以开启对扩展名支持,默认true -->
<property name="favorPathExtension" value="true" />
<!-- 用于开启 /userinfo/123?format=json的支持,默认false -->
<property name="favorParameter" value="true" />
<!-- 在没有扩展名和参数时即: "/user/1" 时的默认展现形式 -->
<property name="defaultContentType" value="application/xml" />
<property name="mediaTypes">
	<map>
		<entry key="xml" value="application/xml" />
		<entry key="json" value="application/json" />
		<entry key="jsonp" value="application/javascript"/>
	</map>
</property>

重写MappingJacksonJsonpView 类
package org.springframework.web.servlet.view.jsonp;

import org.springframework.web.servlet.view.json.MappingJacksonJsonView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

public class MappingJacksonJsonpView extends MappingJacksonJsonView {

	/**
	 * Default content type. Overridable as bean property.
	 */
	public static final String DEFAULT_CONTENT_TYPE = "application/javascript";

	@Override
	public String getContentType() {
		return DEFAULT_CONTENT_TYPE;
	}

	/**
	 * Prepares the view given the specified model, merging it with static
	 * attributes and a RequestContext attribute, if necessary. Delegates to
	 * renderMergedOutputModel for the actual rendering.
	 * 
	 * @see #renderMergedOutputModel
	 */
	@Override
	public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
		if ("GET".equals(request.getMethod().toUpperCase())) {
			@SuppressWarnings("unchecked")
			Map<String, String[]> params = request.getParameterMap();
			if (params.containsKey("callback")) {
				response.getOutputStream().write(new String(params.get("callback")[0] + "(").getBytes());
				super.render(model, request, response);
				response.getOutputStream().write(new String(");").getBytes());
				response.setContentType("application/javascript");
			} else {
				super.render(model, request, response);
			}
		} else {
			super.render(model, request, response);
		}
	}
}


7、cxf rest 支持jsonp的问题。
参见:http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-JSONWithPadding%28JSONP%29
One option for supporting "JSON With Padding" (JSONP) is to extend the default JSONProvider and override its writeTo method as follows:
@Produces("application/javascript")
class JsonpProvider extends JSONProvider {
		
    @Override
    public void writeTo(Object obj, Class<?> cls, Type genericType, Annotation[] anns, MediaType m, MultivaluedMap<String, Object> headers,
	OutputStream os) throws IOException {
	String prefix = getContext().getHttpServletRequest().getParameter("_jsonp");
	boolean hasPrefix = !isEmpty(prefix);
	if(hasPrefix) {
	    os.write(prefix.getBytes(HttpUtils.getSetEncoding(m, headers, "UTF-8")));
	    os.write('(');
	}
	super.writeTo(obj, cls, genericType, anns, m, headers, os);
	if(hasPrefix) {
		os.write(')');
	}
    }
}

Similar approach can work when Jackson is used.
Alternatively, a custom servlet filter can be used to support JSONP. Please read the Supporting JSONP blog post for more information.
Starting from CXF 2.3.4 and 2.4.0, JSONP can be supported with the help of CXF in/out interceptors:
<jaxrs:server id="bookJsonp" address="/jsonp">
    <jaxrs:serviceBeans>
      <ref bean="serviceBean" />
    </jaxrs:serviceBeans>		  

    <jaxrs:inInterceptors>
       <bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpInInterceptor"/>
    </jaxrs:inInterceptors>
    <jaxrs:outInterceptors>
       <bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPreStreamInterceptor"/>
       <bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPostStreamInterceptor"/>
    </jaxrs:outInterceptors> 
</jaxrs:server>

JsonpInInterceptor checks if a JSONP callback query parameter is available (default is _jsonp) and if yes then it saves its value on the current exchange for out interceptors to know if they have to write the paddings or not. The name of the expected callback parameter can be customized. JsonpPreStreamInterceptor and JsonpPostStreamInterceptor ensure the actual JSON stream is 'padded' properly. JsonpPreStreamInterceptor will also set Content-Type to "application/x+javascript" by default but this can be changed:
<jaxrs:server id="bookJsonp" address="/jsonp">
    <jaxrs:serviceBeans>
      <ref bean="serviceBean" />
    </jaxrs:serviceBeans>		  

    <jaxrs:inInterceptors>
       <bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpInInterceptor">
          <property name="callbackParam" value="myjsonp"/>
       </bean> 
    </jaxrs:inInterceptors>
    <jaxrs:outInterceptors>
       <bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPreStreamInterceptor">
           <property name="mediaType" value="text/x+javascript"/>
       </bean>
       <bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPostStreamInterceptor">
           <!-- default is ');' -->
           <property name="paddingEnd" value=")"/>
       </bean>
    </jaxrs:outInterceptors> 
</jaxrs:server>


8、关于ThreadLocal与线程池的问题。
Web服务器使用线程池,所以会有重用线程的问题,而ThreadLocal是根据线程ID来区分的。
http://blog.csdn.net/comliu/article/details/3186778
http://hi.baidu.com/sqxxr/item/e9946b34427c5ec02e8ec294

9、安装tomcat支持apr
cd /usr/local/apache-tomcat-6.0.18/bin/tomcat-native-1.1.14-src/jni/native/
 ./configure --prefix=/usr/local/apr
 ./configure --with-apr=/usr/local/apr
 make
 make install

http://blog.163.com/chhj_292/blog/static/12229472008101434124476/
  • 大小: 44.9 KB
  • 大小: 43.8 KB
  • 大小: 41.7 KB
分享到:
评论
2 楼 fengfujie 2013-08-07  
cxf rest 支持jsonp的问题。我按照你这个方式返回的数据是这样的怎么回事
callback(<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ats><city_list><city><adcode>100000</adcode><citycode></citycode><enable>1</enable><latitude>39.915085</latitude><longitude>116.3683244</longitude><name_en>The People's Republic of China</name_en><name_zh>中华人民共和国</name_zh><pinyin>ZhongHuaRenMinGongHeGuo</pinyin><short_code>ZHRMGHG</short_code></city><city><adcode>110000</adcode><citycode>010</citycode><enable>1</enable><latitude>39.904989</latitude><longitude>116.405285</longitude><name_en>Beijing City</name_en><name_zh>北京市</name_zh><pinyin>BeiJingShi</pinyin><short_code>BJ</short_code></city><city><adcode>110101</adcode><citycode>010</citycode><enable>1</enable><latitude>39.917544</latitude><longitude>116.418757</longitude><name_en>Dongcheng District</name_en><name_zh>东城区</name_zh><pinyin>DongChengQu</pinyin><short_code>DC</short_code></city><city><adcode>110102</adcode><citycode>010</citycode><enable>1</enable><latitude>39.915309</latitude><longitude>116.366794</longitude><name_en>Xicheng District</name_en><name_zh>西城区</name_zh><pinyin>XiChengQu</pinyin><short_code>XC</short_code></city><city><adcode>110105</adcode><citycode>010</citycode><enable>1</enable><latitude>39.921489</latitude><longitude>116.486409</longitude><name_en>Chaoyang District</name_en><name_zh>朝阳区</name_zh><pinyin>ChaoYangQu</pinyin><short_code>CY</short_code></city><city><adcode>110106</adcode><citycode>010</citycode><enable>1</enable><latitude>39.860337</latitude><longitude>116.312765</longitude><name_en>Fengtai District</name_en><name_zh>丰台区</name_zh><pinyin>FengTaiQu</pinyin><short_code>FS</short_code></city><city><adcode>110107</adcode><citycode>010</citycode><enable>1</enable><latitude>39.926085</latitude><longitude>116.186736</longitude><name_en>Shijingshan District</name_en><name_zh>石景山区</name_zh><pinyin>ShiJingShanQu</pinyin><short_code>SJS</short_code></city><city><adcode>110108</adcode><citycode>010</citycode><enable>1</enable><latitude>39.956074</latitude><longitude>116.310316</longitude><name_en>Haidian District</name_en><name_zh>海淀区</name_zh><pinyin>HaiDianQu</pinyin><short_code>HD</short_code></city><city><adcode>110109</adcode><citycode>010</citycode><enable>1</enable><latitude>39.937183</latitude><longitude>116.105381</longitude><name_en>Mentougou District</name_en><name_zh>门头沟区</name_zh><pinyin>MenTouGouQu</pinyin><short_code>MTG</short_code></city><city><adcode>110111</adcode><citycode>010</citycode><enable>1</enable><latitude>39.735535</latitude><longitude>116.139157</longitude><name_en>Fangshan District</name_en><name_zh>房山区</name_zh><pinyin>FangShanQu</pinyin><short_code>FS</short_code></city><city><adcode>110112</adcode><citycode>010</citycode><enable>1</enable><latitude>39.902486</latitude><longitude>116.658603</longitude><name_en>Tongzhou District</name_en><name_zh>通州区</name_zh><pinyin>TongZhouQu</pinyin><short_code>TZ</short_code></city><city><adcode>110113</adcode><citycode>010</citycode><enable>1</enable><latitude>40.128936</latitude><longitude>116.653525</longitude><name_en>Shunyi District</name_en><name_zh>顺义区</name_zh><pinyin>ShunYiQu</pinyin><short_code>SY</short_code></city><city><adcode>110114</adcode><citycode>010</citycode><enable>1</enable><latitude>40.218085</latitude><longitude>116.235906</longitude><name_en>Changping District</name_en><name_zh>昌平区</name_zh><pinyin>ChangPingQu</pinyin><short_code>CP</short_code></city><city><adcode>110115</adcode><citycode>010</citycode><enable>1</enable><latitude>39.755477</latitude><longitude>116.337733</longitude><name_en>Daxing District</name_en><name_zh>大兴区</name_zh><pinyin>DaXingQu</pinyin><short_code>DX</short_code></city><city><adcode>110116</adcode><citycode>010</citycode><enable>1</enable><latitude>40.324272</latitude><longitude>116.637122</longitude><name_en>Huairou District</name_en><name_zh>怀柔区</name_zh><pinyin>HuaiRouQu</pinyin><short_code>HR</short_code></city><city><adcode>110117</adcode><citycode>010</citycode><enable>1</enable><latitude>40.144783</latitude><longitude>117.112335</longitude><name_en>Pinggu District</name_en><name_zh>平谷区</name_zh><pinyin>PingGuQu</pinyin><short_code>PG</short_code></city><city><adcode>110228</adcode><citycode>010</citycode><enable>1</enable><latitude>40.377362</latitude><longitude>116.843352</longitude><name_en>Miyun County</name_en><name_zh>密云县</name_zh><pinyin>MiYunXian</pinyin><short_code>MY</short_code></city><city><adcode>110229</adcode><citycode>010</citycode><enable>1</enable><latitude>40.465325</latitude><longitude>115.985006</longitude><name_en>Yanqing County</name_en><name_zh>延庆县</name_zh><pinyin>YanQingXian</pinyin><short_code>YQ</short_code></city><city><adcode>120000</adcode><citycode>022</citycode><enable>1</enable><latitude>39.125596</latitude><longitude>117.190182</longitude><name_en>Tianjin City</name_en><name_zh>天津市</name_zh><pinyin>TianJinShi</pinyin><short_code>TJ</short_code></city><city><adcode>120101</adcode><citycode>022</citycode><enable>1</enable><latitude>39.118327</latitude><longitude>117.195907</longitude><name_en>Heping District</name_en><name_zh>和平区</name_zh><pinyin>HePingQu</pinyin><short_code>HP</short_code></city></city_list><code>1</code><message>Successful.</message><result>true</result><timestamp>1375858376</timestamp><total>3223</total><version>2.0 - 2.0.3218.1805</version></ats>)
1 楼 苹果超人 2013-07-21  
请问一下cxf-extension-jaxrsbinding.xml在哪个jar包中,我一直缺这个文件。

相关推荐

    SPRING-MVC-MQ-CXF-REST_Demo

    "SPRING-MVC-MQ-CXF-REST_Demo"这个项目很可能是用来演示如何在同一个应用中整合Spring MVC、MQ、CXF和REST技术。项目可能包含了以下部分: 1. Spring MVC配置:展示了如何设置DispatcherServlet、视图解析器以及...

    spring cxf rest demo

    在这个项目中,开发者可以学习到如何利用CXF作为服务端的REST服务提供者,以及Spring如何帮助管理和配置这些服务。 Apache CXF是一个开源的Java框架,它提供了创建Web服务的能力,包括SOAP和RESTful服务。CXF支持...

    webservice-cxf-spring-jar.zip

    【描述】中的“webservice cxf spring jar包大全”指的是这个压缩包内集成了Apache CXF和Spring框架的多个组件,以及可能的依赖库。"下载,超好用的"表明这些JAR文件是经过验证的,且在实际开发中被广泛使用,对于...

    CXF整合spring实现REST接口开发

    本篇将详细介绍如何利用CXF和Spring进行REST接口的开发。 首先,我们需要在项目中引入CXF和Spring的相关依赖。在Maven工程中,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache.cxf ...

    spring-boot-camel-cxf-rest-example

    cxf-rest-example-master`可能包含了标准的Spring Boot项目结构,如`src/main/java`用于存放源代码,`src/main/resources`存储配置文件,`pom.xml`或`build.gradle`定义项目构建信息,还有可能包含测试代码和文档。...

    Apache CXF + Spring3 + REST + JSON配置

    - 在Spring配置中启用CXF的Bus,通过`&lt;jaxrs:server&gt;`标签定义REST服务的位置和实现。 2. **定义REST服务**: - 使用JAX-RS(Java API for RESTful Web Services)注解来声明REST资源。例如,用`@Path`定义URL...

    apache-cxf-2.5.2

    Apache CXF 是一个开源的Java框架,...此外,他们还需要了解如何在Spring框架中集成CXF,以便更好地管理服务生命周期和依赖注入。对于更高级的使用,开发者可能需要深入研究数据绑定、安全性和性能优化等方面的知识。

    Spring CXF Restful 实例

    在IT行业中,Spring CXF是一个广泛使用的开源框架,它整合了Spring框架的功能和Apache CXF的服务堆栈,为开发人员提供了构建和实现Web服务的强大工具。在这个“Spring CXF Restful实例”中,我们将深入探讨如何利用...

    CXF-REST搭建WebService服务端demo

    在IT行业中,构建RESTful Web服务是常见的任务,它提供了轻量级、可扩展的通信方式。本示例将详细讲解如何...在ws-cxf-rest-server这个项目压缩包中,应该包含了所有这些配置文件和源代码,你可以进一步研究和学习。

    spring4+cxf3+maven3整合客户端与服务端

    在IT行业中,Spring、CXF和Maven是三个非常重要的框架和工具,它们在构建高效、可维护的Java应用程序中发挥着关键作用。本项目整合了Spring 4、CXF 3和Maven 3,旨在创建一个服务端和客户端的完整解决方案。以下是...

    cxf+spring发布webservice和restservice

    在项目中,"CXFService"可能包含这些配置以及服务接口和实现。 发布服务后,你需要通过WSDL(Web服务描述语言)文件来描述你的SOAP服务,以便其他系统可以发现和调用。CXF自动生成WSDL,你可以通过指定的URL访问。...

    CXF与spring整合实现

    在企业级应用开发中,Apache CXF与Spring框架的结合被广泛采用,以实现高效、灵活的Web服务开发。本文将深入探讨CXF与Spring如何整合,以及如何在Tomcat环境下部署Web服务。 #### 一、CXF与Spring整合概述 **CXF**...

    spring整合CXF开发webService所需jar包

    在Java世界中,Spring框架和Apache CXF是两个非常重要的组件。Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)等功能,而CXF则是一个用于构建和消费Web服务的开源框架。当我们将两者结合时,...

    spring-cxf-rest-example

    在这个项目中,`spring-cxf-rest-example-master`可能是项目的主分支或版本,意味着源码包含了完整的目录结构和所有必要的配置文件。这些文件可能包括: 1. **pom.xml**:Maven的项目对象模型文件,定义了项目的...

    spring-boot-cxf

    3. 定义服务接口和实现:编写符合JAX-WS或JAX-RS规范的服务接口和其实现类。 4. 创建服务发布类:使用Spring Boot的`@SpringBootApplication`注解,定义一个类,通过`@Endpoint`或`@Component`注解暴露服务。 5. ...

    cxf框架包 apache-cxf-3.4.3.tar.gz

    - 创建服务接口和实现 - 使用CXF工具生成客户端代码 - 配置服务发布和消费 - 调试和测试服务 **8. 扩展与集成** CXF可以与Spring框架无缝集成,方便进行依赖注入和事务管理。此外,它还支持多种数据绑定技术,如...

    spring 3.0.5 集成cxf

    在IT行业中,Spring框架是Java企业级应用开发的首选,而CXF则是一个流行的开源服务框架,用于构建和消费Web服务。"spring 3.0.5 集成cxf"这一主题聚焦于如何将Spring 3.0.5版本与Apache CXF整合,以实现高效、灵活的...

    spring-cxf-ws:一些使用spring和cxf生成webservice Rest和Soap的例子

    总的来说,"spring-cxf-ws"项目提供了一系列示例,展示了如何在Spring环境中利用Apache CXF创建和消费Web服务。这些例子涵盖了从基础的SOAP和REST服务创建,到高级的特性如安全性配置和测试策略。通过研究和实践这些...

    Spring整合CXF demo

    CXF使得开发者能够以简单的方式构建和实现服务,同时提供了丰富的客户端和服务器端API。 ### 3. Spring与CXF整合的意义 Spring和CXF的结合,可以让开发者利用Spring的容器管理服务,以及CXF的强大Web服务功能。通过...

    webservice-cxf-2.3.5

    CXF 支持 JAXB(Java Architecture for XML Binding)和 Aegis 来进行对象到 XML 和 XML 到对象的转换,简化了数据交换过程。 6. **传输协议和绑定**: - HTTP/HTTPS:CXF 支持标准的 HTTP 和安全的 HTTPS 协议。...

Global site tag (gtag.js) - Google Analytics