cxf+srping+jaxrs

     用resteasy搭建了一個rest風格的項目,改用apach 實現相同的功能.

    cxf是Services 框架,支持web-service的多種協議 ,可以運用cxf來構建相關的web service 服務(cxf).

    jaxrs(Java API for RESTful Web Services),是一個Java 編程語言的應用程序接口,支持按照表述性狀態轉移(REST)架構風格創建Web服務(其實此服務更傾向於理解成是httpservice,比如get或者post,當post中傳遞的是soap的xml格式,還有點webservice的樣子).

    本着實現與resteasy相同功能,因而此次實驗,僅僅運用了cxf中jaxrs中的一部分功能.主要測試get,put,返回json格式

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>stu</groupId>
		<artifactId>stu</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>cxf</artifactId>
	<packaging>war</packaging>
	<dependencies>
		<!-- jaxrs 依賴 -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxrs</artifactId>
			<version>3.0.0-milestone1</version>
		</dependency>
		<!--轉sjon -->
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-jaxrs</artifactId>
			<version>1.9.13</version>
		</dependency>
		<!-- spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>

	</dependencies>
</project>
spring-cxf.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xmlns:jaxrs="http://cxf.apache.org/jaxrs"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
						http://www.springframework.org/schema/context 
						http://www.springframework.org/schema/context/spring-context-3.0.xsd 
						http://www.springframework.org/schema/tx 
        				http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
	                    http://cxf.apache.org/jaxws 
						http://cxf.apache.org/schemas/jaxws.xsd 
	                    http://cxf.apache.org/jaxrs 
	                    http://cxf.apache.org/schemas/jaxrs.xsd">

	<context:component-scan base-package="cxf.test" />
	<!--事務之類,沒用到,此處可不配-->
	<context:annotation-config />
	
	<!--配置cxf的server(一個server相當於resteasy的一個application)-->
		<!-- jaxrs:server中address 可設置前綴 -->
	<jaxrs:server id="testServiceContainer">
		<!--配置server對應的serviceBean(一個serviceBean相當於resteasy中的resource)-->
		<jaxrs:serviceBeans>
			<ref bean="testService" />
		</jaxrs:serviceBeans>
		
		<!--配置相關provider(跟resteasy配置provider一致,因爲都是屬於jaxrs的東西)-->
		<jaxrs:providers>
			<!--對象序列化json -->
			<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
			<!--自定義時間轉yyyy-MM-dd HH:mm:ss -->
			<bean class="cxf.test.provider.JacksonConfigurator" />
		</jaxrs:providers>
	</jaxrs:server>
	
	<!-- 設置accept與accept_language,使用jaxrs指定返回值,可不配-->
<!-- 	<jaxrs:extensionMappings>
		<entry key="xml" value="application/xml" />
	</jaxrs:extensionMappings>
	<jaxrs:languageMappings>
		<entry key="en" value="en-gb" />
	</jaxrs:languageMappings> -->
</beans> 
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="JAXRS-cxf" version="3.0">
	<display-name>cxf</display-name>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:spring*.xml</param-value>
	</context-param>

	<!-- spring context listener -->
	<!--處理一些內存泄漏問題,spring中不存在此問題,Struts等會有這些問題,詳情百度...-->
<!-- 	<listener> 
	<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> 
	</listener> -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- CXFservlet(本次實驗通過http請求,服務器應servlet技術處理)-->
	<servlet>
		<servlet-name>cxf</servlet-name>
		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>cxf</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
	
</web-app>
處理返回時間格式的provider

package cxf.test.provider;

import java.text.SimpleDateFormat;

import javax.ws.rs.Produces;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import org.codehaus.jackson.map.ObjectMapper;

/*@Provider*/
@Produces("application/json")
public class JacksonConfigurator implements ContextResolver<ObjectMapper>{
    private ObjectMapper mapper = new ObjectMapper();

    public JacksonConfigurator() {
    	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	mapper.setDateFormat(dateFormat);
    }

    @Override
    public ObjectMapper getContext(Class<?> arg0) {
        return mapper;
    }
}
service

package cxf.test.service;

import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import cxf.test.vo.Student;

@Path("test")
public interface TestService {
	@GET
	@Path("get")
	@Produces(MediaType.APPLICATION_JSON)
	public Student testGet(@QueryParam("name")String name,
			@QueryParam("marray")Boolean marry,
			@QueryParam("age")Integer age,
			@QueryParam("time")Long time
			);
	@POST
	@Path("post")
	@Produces(MediaType.APPLICATION_JSON)
	public Student testPost(@FormParam("name")String name,
			@FormParam("marray")Boolean marry,
			@FormParam("age")Integer age,
			@FormParam("time")Long time
			);
}
serviceImpl

package cxf.test.service.impl;

import java.util.Date;

import org.springframework.stereotype.Service;

import cxf.test.service.TestService;
import cxf.test.vo.Student;

@Service("testService")
public class TestServiceImpl implements TestService {

	@Override
	public Student testGet(String name, Boolean marry, Integer age,Long time) {
		return new Student(name, age, marry, new Date(time));
	}

	@Override
	public Student testPost(String name, Boolean marry, Integer age,Long time) {
		return new Student(name, age, marry, new Date(time));
	}

}
student

package cxf.test.vo;

import java.util.Date;

public class Student {
	private String name;
	private Integer age;
	private Boolean marry;
	private Date birthday;
	public Student(){}
	public Student(String name, Integer age, Boolean marry, Date birthday) {
		super();
		this.name = name;
		this.age = age;
		this.marry = marry;
		this.birthday = birthday;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Boolean getMarry() {
		return marry;
	}
	public void setMarry(Boolean marry) {
		this.marry = marry;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	
}
分別用get與post(x-www-form-urlencoded)測試ok.

     此處搭建應用層與resteasy應用層都是使用jaxrs,所有相關用法都是相通,包括參數接受與返回值處理,只是根據配置不同(server-serverBean,application-resource)進行不同的url印射.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章