jersey2.26+spring5+jpa一步步搭建restful服務

前言

 首先,爲何想選擇Jersey作restful服務呢?我我的比較喜歡它的插件化設計,能夠方便的注入本身的全局處理邏輯。再一個就是能夠生成wadl描述文件,供查詢服務方法。因此在學習spring的過程當中,特地抽時間作了jersey+spring集成的驗證。在本次搭建的過程當中,爲了在jersey服務中啓動spring事務,從網上查閱了很多。先是看到com.sun.jersey例子,後來發現版本比較低,後轉過頭去看org.glassfish.jersey。吭吭哧哧服務啓動了,卻又發現沒法經過spring容器實例化服務,沒法開啓事務,拿不到懶加載數據。又查閱資料來回調試,解決版本不匹配的問題,將jersey-spring3升級成jersey-spring4。摸索的過程老是枯燥的,好在總算是一個個問題的排查解決,終究實現了本身想要的功能! 在這裏把我本身摸索過程當中涉及到的重點位置分享給你們,但願能對你們有所幫助。css

1、關於Jersey

 Jersey RESTful 框架是開源的RESTful框架, 實現了JAX-RS (JSR 311 & JSR 339) 規範。它擴展了JAX-RS 參考實現, 提供了更多的特性和工具, 能夠進一步地簡化 RESTful service 和 client 開發。儘管相對年輕,它已是一個產品級的 RESTful service 和 client 框架。與Struts相似,它一樣能夠和hibernate,spring框架整合。html

 jersey1.X使用的是sun的com.sun.jerseyjava

 jersey2.X使用的是glassfish的org.glassfish.jerseynode

2、集成環境說明

 Java:1.8.0_15二、SpringMVC:5.0.1.RELEASE、Jersey:2.26-b0四、開發工具:eclipse、涉及技術點:springmvc,spring-security,spring data jpa,jerseymysql

3、項目結構簡介

 3.一、simm.spring.web是web層,simm.spring.restapi是jersey服務層
web

 ·spring

 3.二、父級spring-web的POM文件中配置spring jar包依賴sql

<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>simm.study</groupId>
        <artifactId>spring-study</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>spring-web</artifactId>
    <packaging>pom</packaging>
    <properties>
        <springframework.version>5.0.1.RELEASE</springframework.version>
        <!--下面這兩個是springAOP須要用到 -->
        <aspectjweaver.version>1.9.0.RC2</aspectjweaver.version>
        <persistence-api.version>1.0.2</persistence-api.version>
        <hibernate.version>5.2.12.Final</hibernate.version>
        <json.version>2.9.2</json.version>
        <security-version>5.0.0.RELEASE</security-version>
        <logback.version>1.1.1</logback.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${json.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${json.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${json.version}</version>
        </dependency>
        <!-- 4)springmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!-- springmvc-orm -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <!--下面兩個提供對 AspectJ 的支持,是 springmvc-aspects 所須要依賴的 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectjweaver.version}</version>
        </dependency>
        <!-- 這個jar包與hibernate持久化功能衝突,去掉 -->
        <!-- <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>${persistence-api.version}</version>
        </dependency> -->
        <!--這個必定要有、不用報錯 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>
          <dependency>  
            <groupId>org.springframework.security</groupId>  
            <artifactId>spring-security-core</artifactId>  
            <version>${security-version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework.security</groupId>  
            <artifactId>spring-security-web</artifactId>  
            <version>${security-version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework.security</groupId>  
            <artifactId>spring-security-config</artifactId>  
            <version>${security-version}</version>  
        </dependency>  
        <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.27-incubating</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        <!-- Logback dependencies -->
        <!--<dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency> -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/sqljdbc4 -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>6.3.5.jre8-preview</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
        <!-- jpa 2.0以上的版本 須要 spring framework 5 以上支持 -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
    </dependencies>
    <modules>
        <module>simm.spring.web</module>
        <module>simm.spring.dao</module>
        <module>simm.spring.entity</module>
        <module>simm.spring.service</module>
        <module>simm.spring.common</module>
        <module>simm.spring.restapi</module>
    </modules>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
View Code

   3.三、simm.spring.restapi子項目下的POM文件中配置jersey jar包依賴。jersey-spring4這個jar包是jersey,spring框架整合的關鍵,起橋接做用,使用時可根據須要排除掉jersey指定的jar包文件。apache

<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>simm.study</groupId>
        <artifactId>spring-web</artifactId>
        <version>1.0.0</version>
    </parent>
    <artifactId>simm.spring.restapi</artifactId>
    <name>restful-server</name>
    <description>restful-server</description>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jersey.version>2.26-b04</jersey.version>
        <jersey-spring.version>2.26-b04</jersey-spring.version>
        <servlet-api-version>3.1.0</servlet-api-version>
        <jcloverslf4j.version>1.7.6</jcloverslf4j.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.ext</groupId>
            <artifactId>jersey-spring4</artifactId>
            <version>${jersey-spring.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-beans</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-web</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jersey-container-servlet-core</artifactId>
                    <groupId>org.glassfish.jersey.containers</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>hk2</artifactId>
                    <groupId>org.glassfish.hk2</groupId>
                </exclusion>
                <exclusion>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjrt</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-server -->
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.ext</groupId>
            <artifactId>jersey-entity-filtering</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${jcloverslf4j.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.44</version>
        </dependency>
        <dependency>
            <groupId>simm.study</groupId>
            <artifactId>simm.spring.entity</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>simm.study</groupId>
            <artifactId>simm.spring.dao</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>simm.study</groupId>
            <artifactId>simm.spring.common</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</project>
View Code

4、在web.xml中配置jersey請求的sevlet容器

 4.一、web.xml配置文件展現json

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 <display-name>my springmvc</display-name>
 <!-- 配置上下文的 spring.profiles.active -->
 <!-- https://www.cnblogs.com/vanl/p/5759671.html -->
 <context-param>
  <param-name>spring.profiles.active</param-name>
  <param-value>mysql</param-value>
 </context-param>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath*:application-*.xml,classpath*:jdbc-*.xml</param-value>
 </context-param>
 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
 </listener>
 <!-- servlet 容器的配置 -->
 <servlet>
  <!-- 配置DispatcherServlet -->
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 設置啓動順序 指定spring mvc配置文件位置 不指定使用默認狀況 -->
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <!-- <param-value>/WEB-INF/spring-mvc.xml,classpath*:/applicationContext.xml</param-value> -->
   <param-value></param-value>
  </init-param>
  <!-- 多媒體文件上傳配置,該配置意味着啓用標準的多媒體解析器StandardServletMultipartResolver -->
  <load-on-startup>1</load-on-startup>
  <multipart-config>
   <location/>
   <!-- 臨時目錄能夠不配置,默認是"" 
   <location>/tmp</location> 上傳文件的大小限制,示例:5M -->
   <max-file-size>5242880</max-file-size>
   <!-- 一次表單提交中文件的大小限制,示例:10M -->
   <max-request-size>10485760</max-request-size>
   <!-- 多大的文件會被自動保存到硬盤上。0 表明全部 -->
   <file-size-threshold>0</file-size-threshold>
  </multipart-config>
 </servlet>
 <!-- 配置映射 servlet-name和DispatcherServlet的servlet一致 
 靜態資源要經過 DispatcherServlet 進行分發,這樣才能進行版本解析 -->
 <servlet-mapping>
       <servlet-name>springmvc</servlet-name>
       <!-- 攔截以/全部請求,服務端請求能夠本身添加 .do 後綴便可 -->
       <url-pattern>*.do</url-pattern>
       <url-pattern>*.js</url-pattern>
       <url-pattern>*.css</url-pattern>
 </servlet-mapping>
 <servlet>
     <servlet-name>JerseyServlet</servlet-name>
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
     <init-param>
         <param-name>javax.ws.rs.Application</param-name>
         <!-- 這個類是資源註冊類   -->
         <param-value>simm.spring.restapi.config.MyRestfulService</param-value>
     </init-param>
     <load-on-startup>2</load-on-startup>
 </servlet>
  <!-- =================== HiddenHttpMethodFilter end ==================== -->
 <servlet-mapping>
     <servlet-name>JerseyServlet</servlet-name>
     <url-pattern>/api/*</url-pattern>
 </servlet-mapping>
 <!-- 配置 end --> 
 <welcome-file-list>
  <welcome-file>/free/list.do</welcome-file>
 </welcome-file-list>
</web-app>
View Code

  4.二、關於contextConfigLocation與listener的配置簡單說明

 搭建過程當中,發現啓動項目時總是提示找不到applicationContext.xml文件。經過調試代碼,發現jersey-spring4-2.26-b04.jar下繼承接口WebApplicationInitializer實現了啓動類 SpringWebApplicationInitializer。這段邏輯會從WebApplicationContext中去讀取contextConfigLocation配置項,假如讀不到值就會自動設置初始化路徑applicationContext.xml。所以就有了web.xml文件中的context-param>contextConfigLocation 的配置,根據源碼配置系統全局監聽器ContextLoaderListener和RequestContextListener。全局監聽的配置能夠保證jersey的servlet容器一樣可以讀取到spring容器中的對象。

  

 4.三、關於jersey請求的servlet容器配置說明

  • servlet-class:org.glassfish.jersey.servlet.ServletContainer
  • servlet-mapping>url-pattern:/api/*,即restful服務請求從api層級開始
  • init-param[javax.ws.rs.Application]:simm.spring.restapi.config.MyRestfulService,這個類是本身項目對jersey的配置說明,聲明本身的resouce服務路徑,並註冊一些全局插件

 

 4.四、simm.spring.restapi.config.MyRestfulService 類源碼說明。

 在網上查閱資料時,有些文章指出須要注入 RequestContextFilter過濾器,我的測試示例中發現尚未受到影響,在個人代碼裏不用這個過濾器也照樣能夠正常運行。可能尚未涵蓋到這塊功能。調用packages方法,指定服務資源所在的包名。此外,還註冊了json、log、異常處理、跨域處理幾個插件。

package simm.spring.restapi.config;

import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.logging.LoggingFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.spring.scope.RequestContextFilter;

public class MyRestfulService extends ResourceConfig {
     public MyRestfulService(){
        // 須要注入spring組件解析過濾器
        register(RequestContextFilter.class);
        // 加載resources
        packages("simm.spring.restapi.resource");
        // 註冊數據轉換器
        register(JacksonFeature.class);
        // 註冊日誌
        register(LoggingFeature.class);
        // 異常處理
        register(ExceptionHandler.class);
        // 跨域過濾器註冊
        register(CorsFilter.class);
    }
}
  • 異常處理器代碼
@Provider
public class ExceptionHandler implements ExceptionMapper<Exception> {
    public Response toResponse(Exception exception) {
        // TODO Auto-generated method stub
        //LogKit.error(exception.getMessage(), exception);
        return Response.serverError().entity(new JsonResult(false,exception.getMessage(),exception.toString())).build();
    }
}
  • 跨域過濾器代碼
package simm.spring.restapi.config;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;

public class CorsFilter implements ContainerResponseFilter {
    public void filter(ContainerRequestContext creq, ContainerResponseContext cres) {
        // TODO Auto-generated method stub
        cres.getHeaders().add("Access-Control-Allow-Origin", "*");
        /**
         * 容許的Header值,不支持通配符
         */
        cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
        /**
         * 即便只用其中幾種,header和options是不能刪除的,由於瀏覽器經過options請求來獲取服務的跨域策略
         */
        cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        /**
         * CORS策略的緩存時間
         */
        cres.getHeaders().add("Access-Control-Max-Age", "1209600");
    }
}

 5、實現一個本身的resource服務ProcessBlockResource

 5.一、ProcessBlockResource源碼展現

package simm.spring.restapi.resource;

import java.util.*;
import javax.ws.rs.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSONObject;
import simm.spring.common.utils.JpaUtil;
import simm.spring.entity.ProcessBlock;
import simm.spring.restapi.config.MediaTypeExtend;

@Path("processblock")
@Produces(MediaTypeExtend.APPLICATION_JSON_UTF8)
@Component
@Scope("request")
public class ProcessBlockResource {
    @Autowired
    private JpaUtil _jpaUtil;
    @POST
    @Path("getlist")
    @Transactional
    public List<JSONObject> getList(@FormParam("name") String name) {
        JpaUtil jpaUtil = _jpaUtil;//ApplicationContextUtil.instance.getJpaUtil();
        Map<String, Object> params = new HashMap<>();
        params.put("name", name);
        List<ProcessBlock> list = jpaUtil.list(
                "select u from simm.spring.entity.ProcessBlock u where u.name=:name", params, ProcessBlock.class);
        //System.out.println("準備獲取懶加載數據");
        //Set<Node> nodes = list.get(0).getNodeSet();
        List<JSONObject> rows = new ArrayList<JSONObject>();
        list.forEach(a->{
            JSONObject obj = new JSONObject();
            obj.put("Id",a.getId());
            obj.put("Class",a.getClass());
            obj.put("Name",a.getName());
            obj.put("Description",a.getDescription());
            obj.put("SubClass",a.getSubClass());
            //NodeSet 是懶加載對象,若是直接json輸出ProcessBlock對象會致使 因session關閉,沒法獲取關聯數據的異常。
            //這裏顯示的執行一次調用,須要返回的數據最好本身作一次組裝
            obj.put("NodeSet",a.getNodeSet().toArray());
            rows.add(obj);
        });
        return rows;
    }
}
View Code

 5.二、源碼簡要解析

  • ProcessBlockResource類註解說明
  1. @Path:指定資源名爲 processblock
  2. @Produces:指定資源下服務方法默認返回json格式數據
  3. @Component,@Scope("request"):將資源聲明爲一個請求級別的bean組件,解析後交由spring代理進行實例化
  • getList方法註解說明
  1. @POST:聲明爲post請求
  2. @Path:指定服務名爲 getlist
  3. @Transactional:聲明開啓spring事務對方法的攔截,後面咱們會測試事務是否生效

 5.三、啓動Tomcat,查看restful服務啓動狀態。能夠訪問application.wadl,獲得restful服務描述文件。

  

 5.四、使用SoapUI工具測試一下/processblock/getlist服務

  從調用返回能夠看到,服務調用成功,併成功獲取到了懶加載數據NodeSet。說明如今spring容器已經與jersey結合起來,組件初始化以及spring事務的攔截功能都已經正常運轉。接下來咱們就能夠按照這個示例實現本身的restful服務了。關於getList方法中涉及到的實體類以及工具類,若是有須要,請你們參考上篇博文《JPA數據懶加載LAZY配合事務@Transactional使用(三)

   

   至此,jersey+spring5的搭建就完成了。感謝你閱讀到最後,若是你有好的意見或建議,歡迎留言,你們一塊兒交流,共同進步。

參考資料

http://blog.csdn.net/u013628152/article/details/42126521
http://momoxiaoxiong.iteye.com/blog/1214238
https://yq.aliyun.com/articles/47170
http://www.javashuo.com/article/p-qtzpdhdm-gk.html
http://blog.chinaunix.net/uid-28215567-id-3363225.html

相關文章
相關標籤/搜索