用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)));
参考资料: