用apache cxf构建了一个玩具型restful webservice,内嵌jetty,加上gradle,发布无比轻松。
apply plugin: ‘java‘ apply plugin: ‘application‘ repositories { maven { url "http://maven.oschina.net/content/groups/public" } } [compileJava,compileTestJava,javadoc]*.options*.encoding = "UTF-8" dependencies { compile ‘commons-lang:commons-lang:2.6‘ compile ‘javax.ws.rs:javax.ws.rs-api:2.0.1‘ compile ‘org.apache.cxf:cxf-rt-frontend-jaxrs:3.1.2‘ compile ‘org.apache.cxf:cxf-rt-transports-http-jetty:3.1.2‘ compile ‘org.apache.cxf:cxf-rt-rs-security-cors:3.1.3‘ compile ‘com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.6.1‘ compile ‘org.hsqldb:hsqldb:2.3.3‘ compile ‘mysql:mysql-connector-java:5.1.35‘ compile ‘org.hibernate:hibernate:3.5.4-Final‘ compile ‘org.hibernate:hibernate-tools:4.3.1.Final‘ compile ‘commons-httpclient:commons-httpclient:3.1‘ testCompile group: ‘junit‘, name: ‘junit‘, version: ‘4.+‘ } task "create-dirs" << { sourceSets*.java.srcDirs*.each { it.mkdirs() } sourceSets*.resources.srcDirs*.each { it.mkdirs() } } mainClassName = ‘cn.edu.hdu.grs.tdlab.Server‘ jar { version = "0.1.20150908-snapshot" }
然后,要在这个基础上构建一些web页面,正好把最近学的angularJS搬出来用上。
这里就遇到一个问题,我angularJS的应用是部署在Apache Httpd上,于是就产生了一个ajax跨域访问问题。解决方式有两种:JSONP 和 CORS,我比较倾向于CORS。
那么是CXF框架下,添加响应头,最直接的想法是实现一个OutInterceptor。不过无意中发现,CXF已经给了解决方案:CrossOriginResourceSharingFilter。不过大多数中文博客都只提到要配置filter到provider中去,然后就没有然后了。(又要吐槽下,能不能靠谱点?)。试了下,没成功,于是果断上官网找资料,官网给了例子,CrossOriginResourceSharing注解到需要的地方,然后将filter配置到服务器中,恍然大悟。
接口如下:
@CrossOriginResourceSharing( allowOrigins = { "http://127.0.0.1" }, allowCredentials = true, maxAge = 1 ) @Path(value="/demand") @Produces("application/json") @Consumes("application/json") public interface DemandService { @GET @Path(value="/{id}") public Demand get(@PathParam("id")int id); @GET @Path(value="/{id}/expert/") public List getRecommendExpert(@PathParam("id")int id); @POST @Path(value="/") public Map create(Demand demand,@HeaderParam("token")final String token); @GET @Path(value="/") public List list(@QueryParam("u")Integer uid, @QueryParam("s")int start,@QueryParam("l")int limit); @DELETE @Path(value="/{id}") public Demand delete(@PathParam("id")int id); }
服务端部分代码如下:
JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean(); factoryBean.setResourceClasses(DemandServiceImpl.class); JacksonJaxbJsonProvider jsonProvider = new JacksonJaxbJsonProvider(); CrossOriginResourceSharingFilter crossFilter = new CrossOriginResourceSharingFilter(); factoryBean.setProviders((Arrays.asList(crossFilter,jsonProvider)));
参考资料:
【1】JAX-RS: CORS项目官网 http://cxf.apache.org/docs/jax-rs-cors.html
【2】使用 CORS 解决 AJAX 跨域问题 http://www.open-open.com/lib/view/open1423107683623.html
CXF发布支持ajax跨域访问的restful webservice
原文:http://my.oschina.net/amhuman/blog/511317