使用cxf開發restful接口

  1. 新建maven工程

    1. 新建maven工程
  2. 添加pom依賴

    1. <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/maven-v4_0_0.xsd">
      	<modelVersion>4.0.0</modelVersion>
      	<groupId>com.demo</groupId>
      	<artifactId>cxf-restful</artifactId>
      	<packaging>war</packaging>
      	<version>0.0.1-SNAPSHOT</version>
      	<name>cxf-restful Maven Webapp</name>
      	<url>http://maven.apache.org</url>
      
      	<properties>
      		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      		<maven.compiler.source>1.8</maven.compiler.source>
      		<maven.compiler.target>1.8</maven.compiler.target>
      		<cxf-version>3.1.1</cxf-version>
      		<spring-version>5.1.5.RELEASE</spring-version>
      		<slfj-version>1.7.25</slfj-version>
      	</properties>
      	<dependencies>
      		<dependency>
      			<groupId>org.springframework</groupId>
      			<artifactId>spring-core</artifactId>
      			<version>${spring-version}</version>
      		</dependency>
      		<dependency>
      			<groupId>org.springframework</groupId>
      			<artifactId>spring-web</artifactId>
      			<version>${spring-version}</version>
      		</dependency>
      
      		<dependency>
      			<groupId>org.springframework</groupId>
      			<artifactId>spring-context</artifactId>
      			<version>${spring-version}</version>
      		</dependency>
      		<dependency>
      			<groupId>org.springframework</groupId>
      			<artifactId>spring-beans</artifactId>
      			<version>${spring-version}</version>
      		</dependency>
      		<dependency>
      			<groupId>org.slf4j</groupId>
      			<artifactId>slf4j-api</artifactId>
      			<version>${slfj-version}</version>
      		</dependency>
      		<dependency>
      			<groupId>org.slf4j</groupId>
      			<artifactId>slf4j-log4j12</artifactId>
      			<version>${slfj-version}</version>
      			<!--<scope>test</scope> -->
      		</dependency>
      		<dependency>
      			<groupId>commons-lang</groupId>
      			<artifactId>commons-lang</artifactId>
      			<version>2.4</version>
      		</dependency>
      
      		<dependency>
      			<groupId>org.apache.cxf</groupId>
      			<artifactId>cxf-core</artifactId>
      			<version>${cxf-version}</version>
      		</dependency>
      		<dependency>
      			<groupId>javax.ws.rs</groupId>
      			<artifactId>javax.ws.rs-api</artifactId>
      			<version>2.0.1</version>
      		</dependency>
      		<dependency>
      			<groupId>javaee</groupId>
      			<artifactId>javaee-api</artifactId>
      			<version>5</version>
      			<scope>provided</scope>
      		</dependency>
      
      		<dependency>
      			<groupId>org.apache.cxf</groupId>
      			<artifactId>cxf-rt-frontend-jaxrs</artifactId>
      			<version>${cxf-version}</version>
      		</dependency>
      		<dependency>
      			<groupId>org.codehaus.jackson</groupId>
      			<artifactId>jackson-jaxrs</artifactId>
      			<version>1.9.13</version>
      		</dependency>
      		<dependency>
      			<groupId>org.codehaus.jackson</groupId>
      			<artifactId>jackson-xc</artifactId>
      			<version>1.9.13</version>
      		</dependency>
      		<dependency>
      			<groupId>org.apache.cxf</groupId>
      			<artifactId>cxf-rt-transports-http</artifactId>
      			<version>${cxf-version}</version>
      			<scope>compile</scope>
      		</dependency>
      
      
      	</dependencies>
      	<build>
      		<finalName>cxf-restful</finalName>
      	</build>
      </project>
      

       

  3. 編輯web.xml

    1. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
      	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      
      
      	<display-name>CXF Restful Demo</display-name>
      
      	<context-param>
      		<param-name>contextConfigLocation</param-name>
      		<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
      	</context-param>
      
      	<listener>
      		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      	</listener>
      
      	<!-- 配置CXFservlet -->
      	<servlet>
      		<servlet-name>CXFServlet</servlet-name>
      		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
      		<load-on-startup>1</load-on-startup>
      	</servlet>
      
      	<servlet-mapping>
      		<servlet-name>CXFServlet</servlet-name>
      		<url-pattern>/service/*</url-pattern>
      	</servlet-mapping>
      
      	<!-- 設置允許跨域  視情況而定是否需要支持跨域-->
      	<filter>
      		<filter-name>CORSFilter</filter-name>
      		<filter-class>com.demo.cxf.restful.filter.CORSFilter</filter-class>
      	</filter>
      	<filter-mapping>
      		<filter-name>CORSFilter</filter-name>
      		<url-pattern>/service/*</url-pattern>
      	</filter-mapping>
      
      </web-app>
      

       

  4. 編寫測試代碼

    1. 添加配置文件
      1. 添加log4j.properties配置文件,方便輸出日誌
        log4j.rootLogger=INFO, console,dailyFile
        
        log4j.appender.console=org.apache.log4j.ConsoleAppender
        log4j.appender.console.Threshold=DEBUG
        log4j.appender.console.layout=org.apache.log4j.PatternLayout
        log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
        
        
        log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
        log4j.appender.dailyFile.Threshold=DEBUG
        log4j.appender.dailyFile.ImmediateFlush=true
        log4j.appender.dailyFile.Append=true
        log4j.appender.dailyFile.File=/logs/log.log4j
        log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
        log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
        log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
        

         

      2. /src/main/resources/META-INF/spring目錄下新建applicationContent-rest.xml(cxf配置文件)
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
        	xmlns:cxf="http://cxf.apache.org/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        	xmlns:jaxrs="http://cxf.apache.org/jaxrs" 
        	xsi:schemaLocation="
        	http://cxf.apache.org/core 
        	http://cxf.apache.org/schemas/core.xsd 
        	http://cxf.apache.org/jaxrs 
        	http://cxf.apache.org/schemas/jaxrs.xsd 
        	http://www.springframework.org/schema/beans 
        	http://www.springframework.org/schema/beans/spring-beans.xsd">
        	
        	<bean id="InquiryServiceImpl" class="com.demo.cxf.restful.service.impl.InquiryServiceImpl" />
        	<bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
        	<bean id="logInbound" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
        	
        	<jaxrs:server id="InquiryService" address="/InquiryService">
        		<!--輸入攔截器設置 -->
        		<jaxrs:inInterceptors>
        			<ref bean="logInbound" />
        		</jaxrs:inInterceptors>
        		
        		<!--serviceBeans:暴露的WebService服務類 -->
        		<jaxrs:serviceBeans>
        			<ref bean="InquiryServiceImpl"/>
        		</jaxrs:serviceBeans>
        
        		<!--輸出攔截器設置 -->
        		<jaxrs:outInterceptors>
        			<ref bean="logOutbound" />
        		</jaxrs:outInterceptors>
        		
        		<!--支持的數據傳輸格式 -->
        		<jaxrs:extensionMappings>
        			<entry key="json" value="application/json"/>
        			<entry key="xml" value="application/xml"/>
        		</jaxrs:extensionMappings>
        		
        		<!--編碼格式 -->
        		<jaxrs:languageMappings>
        			<entry key="en" value="en-gb"/>
        		</jaxrs:languageMappings>
        		
        		<!--對象轉換 -->
        		<jaxrs:providers>
        			<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
        		</jaxrs:providers>
        	</jaxrs:server>
        </beans>
        
    2. 編寫java代碼
      1. 新建實體類  Student.java
        package com.demo.cxf.restful.entity;
        
        import java.io.Serializable;
        
        import org.codehaus.jackson.annotate.JsonProperty;
        
        public class Student implements Serializable{
            
            private static final long serialVersionUID = 2762010594480998117L;
        
            @JsonProperty("ID")
            private Long id;
            
            @JsonProperty("NAME")
            private String name;
            
            @JsonProperty("SEX")
            private String sex;
            
            @JsonProperty("AGE")
            private Integer age;
        
            public Long getId() {
                return id;
            }
        
            public void setId(Long id) {
                this.id = id;
            }
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public String getSex() {
                return sex;
            }
        
            public void setSex(String sex) {
                this.sex = sex;
            }
        
            public Integer getAge() {
                return age;
            }
        
            public void setAge(Integer age) {
                this.age = age;
            }
            
            public Student() {
                
            }
            
            public Student(Long id, String name, String sex, Integer age) {
                super();
                this.id = id;
                this.name = name;
                this.sex = sex;
                this.age = age;
            }
        }
        

         

      2. 新建接口類  InquiryService.java
        package com.demo.cxf.restful.service.impl;
        
        import java.util.List;
        
        import javax.ws.rs.Consumes;
        import javax.ws.rs.GET;
        import javax.ws.rs.POST;
        import javax.ws.rs.Path;
        import javax.ws.rs.PathParam;
        import javax.ws.rs.Produces;
        import javax.ws.rs.QueryParam;
        import javax.ws.rs.core.MediaType;
        
        import com.demo.cxf.restful.entity.Student;
        
        @Produces(MediaType.APPLICATION_JSON)
        public interface InquiryService {
        
            @GET
            @Path("/student")
            public List<Student> list();
        
            @POST
            @Path("/getStudentById")
            @Consumes(MediaType.APPLICATION_JSON)
            public Student getStudentById(Student stu);
        
            @GET
            @Path("/getStudent/{id}")
            @Consumes({ MediaType.TEXT_XML, MediaType.APPLICATION_JSON })
            public Student getStudent(@PathParam("id") Integer id);
        
            @GET
            @Path("/studentParam")
            @Consumes({ MediaType.TEXT_XML, MediaType.APPLICATION_JSON })
            public Student studentParam(@QueryParam("id") Integer id);
        }
        

         

      3. 新建接口實現類   InquiryServiceImpl.java
        package com.demo.cxf.restful.service.impl;
        
        import java.util.ArrayList;
        import java.util.List;
        
        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;
        
        import com.demo.cxf.restful.entity.Student;
        
        public class InquiryServiceImpl implements InquiryService {
        private static final Logger logger = LoggerFactory.getLogger(InquiryServiceImpl.class);
            
            @Override
            public List<Student> list() {
                List<Student> result = initData();
                return result;
            }
            
            @Override
            public Student getStudentById(Student param) {
                logger.info("param" + param);
                List<Student> result = initData();
                return result.get(param.getId().intValue());
            }
            
            @Override
            public Student getStudent(Integer id){
                logger.info("id" + id);
                List<Student> result = initData();
                
                return result.get(id);
            }
            
            @Override
            public Student studentParam(Integer id) {
                logger.info("id" + id);
                List<Student> result = initData();
                return result.get(id);
            }
            
            private List<Student> initData(){
                List<Student> result = new ArrayList<Student>();
                for (int i = 0; i < 10; i++) {
                    Student stu = null;
                    if(i%2 == 0) {
                        stu = new Student(Long.valueOf(i), "Jack" + i, "男", i);
                    }else {
                        stu = new Student(Long.valueOf(i), "Mary" + i, "女", i);
                    }
                    result.add(stu);
                }
                return result;
            }
        }
        

         

      4. 自定義 跨域過濾器  CORSFilter.java
        package com.demo.cxf.restful.filter;
        
        import java.io.IOException;
        import java.util.Arrays;
        import java.util.HashSet;
        import java.util.Set;
        
        import javax.servlet.Filter;
        import javax.servlet.FilterChain;
        import javax.servlet.FilterConfig;
        import javax.servlet.ServletException;
        import javax.servlet.ServletRequest;
        import javax.servlet.ServletResponse;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        
        public class CORSFilter implements Filter{
        
            @Override
            public void destroy() {
                // TODO Auto-generated method stub
                
            }
        
            @Override
            public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                    throws IOException, ServletException {
              //設置跨域請求
                HttpServletRequest request = (HttpServletRequest) req;
                HttpServletResponse response = (HttpServletResponse) res;
                String[] allowDomains = {"http://runapi.showdoc.cc"};
                Set allowOrigins = new HashSet(Arrays.asList(allowDomains));
                String originHeads = request.getHeader("origin");
                if(allowOrigins.contains(originHeads)){
                    response.setHeader("Access-Control-Allow-Origin", originHeads);
                    response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,HEAD,PUT,PATCH");
                    response.setHeader("Access-Control-Max-Age", "36000");
                    response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Connection, User-Agent, Cookie");
                    response.setHeader("Access-Control-Allow-Credentials","true");
                }
                chain.doFilter(req, response);
            }
        
            @Override
            public void init(FilterConfig arg0) throws ServletException {
                // TODO Auto-generated method stub
                
            }
        }
        

         

  5. 測試接口

    1. 至此,使用cxf開發rrestful接口已經開發完成了,下面就是測試接口訪問情況
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章