Spring MVC 4 RESTFul Web Services CRUD例(ソース付き)【これこそrestful、超定番】

31972 ワード

【本シリーズの他のチュートリアルは続々と翻訳中で、分類:spring 4 mvcをクリックして表示します.ソースコードのダウンロードアドレスは文章の末尾にあります.】
 
【翻訳byは月QQ 605283073のようなのに】
原文住所:http://websystique.com/springmvc/spring-mvc-4-restful-web-services-crud-example-resttemplate/
 
下一篇:
 
Spring 4 MVC@RestController注記REST Serviceを実現
上一篇:Spring MVC 4ファイルアップロードダウンロードHibernate+MySQL例(ソース付き)
 
本文はとても良くて、みんなを推薦してよく見て、多くの人の理解するrestfulは間違っています
ここではSpring MVC 4を用いてCRUD Restful WebServiceを実現し、RestTemplateを通じてRESTクライアントを書き、これらのサービスを定義する.外部のクライアントを通じてこれらのサービスをテストすることもできます.
 
 
簡単&クイック紹介REST
RESTは、Representational State Transfer(表示状態遷移)を表す.
 
Webサービスを設計するために使用できるフレームワークであり、異なるクライアントで呼び出すことができます.
コアコンセプトは、CORBA、RPC、SOAPなどの担当メカニズムではなく、簡単なHTTPプロトコルを使用して呼び出しを実現することです.
 
Rest基礎設計では,リソースは以下の動詞を用いて操作する.
 
  • リソースの作成:HTTP POST
  • を使用
  • リソース取得:HTTP GET
  • を使用
  • 更新リソース:HTTP PUT
  • を使用
  • リソースの削除:HTTP DELETE
  • を使用
    つまり、Restサービス開発者やお客様として、以上の基準に従うべきであることを意味します.
     
     
    返さなければならないタイプは限定されないが、応答として、WebサービスのRestに基づいてJSONまたはXMLが返されるのが一般的である.
     
    クライアントは(HTTP Accept headerを使用する)必要なリソースタイプを指定できますか?サーバは必要なリソースを返します.
    リソースのContent-Typeを指定します.restfulを詳しく理解するには、ここを参照してください:StackOverflow link
     
     
    Restベースのコントローラ
    我々のREST API:
  • GET方式要求/api/user/返却ユーザリスト
  • GET方式要求/api/user/1はidが1のユーザ
  • を返す.
  • POST方式要求/api/user/userオブジェクトのJSONパラメータから新しいuserオブジェクトを作成する
  • PUT方式要求/api/user/3更新idが3の送信json形式のユーザオブジェクト
  • DELETE方式要求/api/user/4 ID 4のuserオブジェクト
  • を削除する.
  • DELETE方式要求/api/user/削除全user
  • package com.websystique.springmvc.controller;
     
    import java.util.List;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.util.UriComponentsBuilder;
     
    import com.websystique.springmvc.model.User;
    import com.websystique.springmvc.service.UserService;
     
    @RestController
    public class HelloWorldRestController {
     
        @Autowired
        UserService userService;  //Service which will do all data retrieval/manipulation work
     
         
        //-------------------Retrieve All Users--------------------------------------------------------
         
        @RequestMapping(value = "/user/", method = RequestMethod.GET)
        public ResponseEntity> listAllUsers() {
            List users = userService.findAllUsers();
            if(users.isEmpty()){
                return new ResponseEntity>(HttpStatus.NO_CONTENT);//You many decide to return HttpStatus.NOT_FOUND
            }
            return new ResponseEntity>(users, HttpStatus.OK);
        }
     
     
        //-------------------Retrieve Single User--------------------------------------------------------
         
        @RequestMapping(value = "/user/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
        public ResponseEntity getUser(@PathVariable("id") long id) {
            System.out.println("Fetching User with id " + id);
            User user = userService.findById(id);
            if (user == null) {
                System.out.println("User with id " + id + " not found");
                return new ResponseEntity(HttpStatus.NOT_FOUND);
            }
            return new ResponseEntity(user, HttpStatus.OK);
        }
     
         
         
        //-------------------Create a User--------------------------------------------------------
         
        @RequestMapping(value = "/user/", method = RequestMethod.POST)
        public ResponseEntity createUser(@RequestBody User user,    UriComponentsBuilder ucBuilder) {
            System.out.println("Creating User " + user.getName());
     
            if (userService.isUserExist(user)) {
                System.out.println("A User with name " + user.getName() + " already exist");
                return new ResponseEntity(HttpStatus.CONFLICT);
            }
     
            userService.saveUser(user);
     
            HttpHeaders headers = new HttpHeaders();
            headers.setLocation(ucBuilder.path("/user/{id}").buildAndExpand(user.getId()).toUri());
            return new ResponseEntity(headers, HttpStatus.CREATED);
        }
     
         
        //------------------- Update a User --------------------------------------------------------
         
        @RequestMapping(value = "/user/{id}", method = RequestMethod.PUT)
        public ResponseEntity updateUser(@PathVariable("id") long id, @RequestBody User user) {
            System.out.println("Updating User " + id);
             
            User currentUser = userService.findById(id);
             
            if (currentUser==null) {
                System.out.println("User with id " + id + " not found");
                return new ResponseEntity(HttpStatus.NOT_FOUND);
            }
     
            currentUser.setName(user.getName());
            currentUser.setAge(user.getAge());
            currentUser.setSalary(user.getSalary());
             
            userService.updateUser(currentUser);
            return new ResponseEntity(currentUser, HttpStatus.OK);
        }
     
        //------------------- Delete a User --------------------------------------------------------
         
        @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)
        public ResponseEntity deleteUser(@PathVariable("id") long id) {
            System.out.println("Fetching & Deleting User with id " + id);
     
            User user = userService.findById(id);
            if (user == null) {
                System.out.println("Unable to delete. User with id " + id + " not found");
                return new ResponseEntity(HttpStatus.NOT_FOUND);
            }
     
            userService.deleteUserById(id);
            return new ResponseEntity(HttpStatus.NO_CONTENT);
        }
     
         
        //------------------- Delete All Users --------------------------------------------------------
         
        @RequestMapping(value = "/user/", method = RequestMethod.DELETE)
        public ResponseEntity deleteAllUsers() {
            System.out.println("Deleting All Users");
     
            userService.deleteAllUsers();
            return new ResponseEntity(HttpStatus.NO_CONTENT);
        }
     
    }

    詳細:
    @RestController:まずSpring 4の新しい注記@RestController注記を使用します. 
    この注記は、各メソッドに@ResponseBody注記を付けることを回避します.つまり@RestController自身が@ResponseBody注釈をつけているので
    @Controllerと@ResponseBodyの結合体.
    @RequestBody:メソッドパラメータが@RequestBodyによって注記されている場合、SpringはHTTPリクエストボディをそのパラメータにバインドします.そうすればSpringは、要求されたACCEPTまたはContent-Type header(プライベート)に従ってHTTP Message convertersを使用してhttpリクエストをdomainオブジェクトに変換します.
     
    @ResponseBody:メソッドに@ResponseBody注記を加えた場合、Springは応答体に値を返します.そうすればSpringはリクエストのContent-Type header(プライベート)に従ってHTTP Message convertersを使用してdomainオブジェクトを応答体に変換します.
     
    ResponseEntityは実際のデータですHTTP応答全体を表す.その利点は、任意のオブジェクトを内部に配置することを制御できることです.
    ステータスコード、ヘッダ情報、応答体を指定できます.HTTP Responseを構築したいという情報が含まれています.
    @PathVariableこの注記は、urlテンプレート変数['{}'の1つ]にメソッドパラメータをバインドする必要があることを意味します.
    一般的に、REST API in Spring 4を実現するには、@RestController,@RequestBody,ResponseEntity,@PathVariableという注釈を理解する必要があります.またspringでは、カスタマイズ可能なものを実現するためのサポートクラスも提供されています.
    MediaType:@RequestMapping注記を持って、特殊なコントローラ方法で追加指定して、MediaTypeで生産したり消費したりすることができます.
     
    このAPIの発行とテスト
     http://localhost:8080/Spring4MVCCRUDRestService.
     
    このAPIをテストするには、POSTMANという外部クライアントを使用します.次に、私たち自身のクライアントも書きます.
    1.すべてのユーザーを取得
     
    POSTMANツールを開き、要求タイプをGETとして選択し、uriを指定します.
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第1张图片
     
    注意:HTTPヘッダは何も指定されていません.送信をクリックすると、すべてのユーザーのリストが受信されます.
     
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第2张图片
     
    HTTP 200応答にも注意.
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第3张图片
     
    なぜこの応答がJSON文字列で送信されたのか知りたいかもしれませんが、応答のContent-Typeヘッダでこれを説明しています.
    JACKSONを追加したので
    
        com.fasterxml.jackson.core
        jackson-databind
        2.5.3
    

    Springはクラスパスでこのライブラリを発見したため、内蔵のMappingJackson 2 HttpMessageConverter変換器を呼び出して応答(オブジェクトセット)をJSONフォーマットに変換します.
    Spring内蔵コンバータの利点は、ほとんどの場合、クラスパスにライブラリを置くだけで変換が完了することです.もちろん時々必要なのは
    私たちのAPIを採用します.たとえば、XML形式も提供しているようであれば、UserクラスにJAXB注釈を付ける必要があります.
     
    2.個々のユーザーの取得
     
    GET方式指定/user/1
     
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第4张图片
    ここで、エラー識別コード付きGET要求を送信してみると、HTTP 404が受信される
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第5张图片
     
    3.Userを作成する
    POSTメソッドの選択、uri/user/POSTMAN Bodyタブの指定、アプリケーション/jsonタイプの選択
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第6张图片
    POSTMANがContent-Typeヘッダ情報を自動的に追加していることに注意してください.
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第7张图片
     
    Accept headerにはclientが認識できるタイプが含まれていることを覚えておいてください.Content-Type headerは、データの実際のタイプを表します.
     
    送信をクリックするとHTTP 200に応答体がありません(apiには応答体に何も送信されていません)
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第8张图片
     
    新しく作成したユーザーを問い合わせることができます
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第9张图片
     
    これはRESTを実現する一般的な実現方式である.しかし、POSTまたはPUT方式の応答体にコンテンツを送信することを阻止する人はいません.でもこれはRESTのAPI?疑わしい.
    いずれにしても、同じユーザーを作成してみると、HTTP競合の応答が得られます.
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第10张图片
     
    4.ユーザーの更新
    ユーザを更新するためにHTTP PUT要求を送信する.
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第11张图片
    注意:今回は応答体を受信しました.これはコントローラのメソッド実装でデータを送信したからです.また,応答体に更新の詳細を送信せず,位置ヘッダのみを送信する人もいるかもしれない(ユーザの作成と同様).
    5.ユーザーの削除
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第12张图片
    6すべてのユーザーを削除
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第13张图片
    7.ユーザーを削除して検証する
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第14张图片
     
    RestTemplateによるREST Clientの書き込み
     
    PostmanはRest Apiをテストする超使いやすいツールですが、RESTを完全に消化したいなら、自分で書いてみてください.
    最も有名なHtppクライアントはHttpClient(Apache HttpComponents)です.
    しかし、RESTサービスにアクセスするには珍しい.
    SpringのRestTemplate 。RestTemplate , 6 HTTP 。  HTTP  RestTemplate :
     
  • HTTP GET : getForObject, getForEntity
  • HTTP PUT : put(String url, Object request, String…​urlVariables)
  • HTTP DELETE : delete
  • HTTP POST : postForLocation(String url, Object request, String…​ urlVariables), postForObject(String url, Object request, ClassresponseType, String…​ uriVariables)
  • HTTP HEAD : headForHeaders(String url, String…​ urlVariables)
  • HTTP OPTIONS : optionsForAllow(String url, String…​ urlVariables)
  • HTTP PATCH and others : exchange execute

  • Restクライアントの定義、RESTサービスの定義
    package com.websystique.springmvc;
     
    import java.net.URI;
    import java.util.LinkedHashMap;
    import java.util.List;
     
    import org.springframework.web.client.RestTemplate;
     
    import com.websystique.springmvc.model.User;
     
    public class SpringRestTestClient {
     
        public static final String REST_SERVICE_URI = "http://localhost:8080/Spring4MVCCRUDRestService";
         
        /* GET */
        @SuppressWarnings("unchecked")
        private static void listAllUsers(){
            System.out.println("Testing listAllUsers API-----------");
             
            RestTemplate restTemplate = new RestTemplate();
            List> usersMap = restTemplate.getForObject(REST_SERVICE_URI+"/user/", List.class);
             
            if(usersMap!=null){
                for(LinkedHashMap map : usersMap){
                    System.out.println("User : id="+map.get("id")+", Name="+map.get("name")+", Age="+map.get("age")+", Salary="+map.get("salary"));;
                }
            }else{
                System.out.println("No user exist----------");
            }
        }
         
        /* GET */
        private static void getUser(){
            System.out.println("Testing getUser API----------");
            RestTemplate restTemplate = new RestTemplate();
            User user = restTemplate.getForObject(REST_SERVICE_URI+"/user/1", User.class);
            System.out.println(user);
        }
         
        /* POST */
        private static void createUser() {
            System.out.println("Testing create User API----------");
            RestTemplate restTemplate = new RestTemplate();
            User user = new User(0,"Sarah",51,134);
            URI uri = restTemplate.postForLocation(REST_SERVICE_URI+"/user/", user, User.class);
            System.out.println("Location : "+uri.toASCIIString());
        }
     
        /* PUT */
        private static void updateUser() {
            System.out.println("Testing update User API----------");
            RestTemplate restTemplate = new RestTemplate();
            User user  = new User(1,"Tomy",33, 70000);
            restTemplate.put(REST_SERVICE_URI+"/user/1", user);
            System.out.println(user);
        }
     
        /* DELETE */
        private static void deleteUser() {
            System.out.println("Testing delete User API----------");
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.delete(REST_SERVICE_URI+"/user/3");
        }
     
     
        /* DELETE */
        private static void deleteAllUsers() {
            System.out.println("Testing all delete Users API----------");
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.delete(REST_SERVICE_URI+"/user/");
        }
     
        public static void main(String args[]){
            listAllUsers();
            getUser();
            createUser();
            listAllUsers();
            updateUser();
            listAllUsers();
            deleteUser();
            listAllUsers();
            deleteAllUsers();
            listAllUsers();
        }
    }

    サーバーを再起動し、上のプログラムを実行します.
    次は出力です.
    Testing listAllUsers API-----------
    User : id=1, Name=Sam, Age=30, Salary=70000.0
    User : id=2, Name=Tom, Age=40, Salary=50000.0
    User : id=3, Name=Jerome, Age=45, Salary=30000.0
    User : id=4, Name=Silvia, Age=50, Salary=40000.0
    Testing getUser API----------
    User [id=1, name=Sam, age=30, salary=70000.0]
    Testing create User API----------
    Location : http://localhost:8080/Spring4MVCCRUDRestService/user/5
    Testing listAllUsers API-----------
    User : id=1, Name=Sam, Age=30, Salary=70000.0
    User : id=2, Name=Tom, Age=40, Salary=50000.0
    User : id=3, Name=Jerome, Age=45, Salary=30000.0
    User : id=4, Name=Silvia, Age=50, Salary=40000.0
    User : id=5, Name=Sarah, Age=51, Salary=134.0
    Testing update User API----------
    User [id=1, name=Tomy, age=33, salary=70000.0]
    Testing listAllUsers API-----------
    User : id=1, Name=Tomy, Age=33, Salary=70000.0
    User : id=2, Name=Tom, Age=40, Salary=50000.0
    User : id=3, Name=Jerome, Age=45, Salary=30000.0
    User : id=4, Name=Silvia, Age=50, Salary=40000.0
    User : id=5, Name=Sarah, Age=51, Salary=134.0
    Testing delete User API----------
    Testing listAllUsers API-----------
    User : id=1, Name=Tomy, Age=33, Salary=70000.0
    User : id=2, Name=Tom, Age=40, Salary=50000.0
    User : id=4, Name=Silvia, Age=50, Salary=40000.0
    User : id=5, Name=Sarah, Age=51, Salary=134.0
    Testing all delete Users API----------
    Testing listAllUsers API-----------
    No user exist----------

    完全な例
    Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】_第15张图片
     
    pomを更新する.xmlプロジェクト依存性の追加
    
      4.0.0
      com.websystique.springmvc
      Spring4MVCCRUDRestService
      war
      1.0.0
      Spring4MVCCRUDRestService Maven Webapp
     
        
            4.2.0.RELEASE
            2.5.3
        
     
        
            
                org.springframework
                spring-webmvc
                ${springframework.version}
            
            
                org.springframework
                spring-tx
                ${springframework.version}
            
     
            
                com.fasterxml.jackson.core
                jackson-databind
                ${jackson.version}
            
            
                javax.servlet
                javax.servlet-api
                3.1.0
            
                 
        
     
     
        
            
                
                    
                        org.apache.maven.plugins
                        maven-compiler-plugin
                        3.2
                        
                            1.7
                            1.7
                        
                    
                    
                        org.apache.maven.plugins
                        maven-war-plugin
                        2.4
                        
                            src/main/webapp
                            Spring4MVCCRUDRestService
                            false
                        
                    
                
            
     
            Spring4MVCCRUDRestService
        
    

     
    User Service
    package com.websystique.springmvc.service;
     
    import java.util.List;
     
    import com.websystique.springmvc.model.User;
     
     
     
    public interface UserService {
         
        User findById(long id);
         
        User findByName(String name);
         
        void saveUser(User user);
         
        void updateUser(User user);
         
        void deleteUserById(long id);
     
        List findAllUsers(); 
         
        void deleteAllUsers();
         
        public boolean isUserExist(User user);
         
    }

     
    package com.websystique.springmvc.service;
     
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.concurrent.atomic.AtomicLong;
     
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
     
    import com.websystique.springmvc.model.User;
     
    @Service("userService")
    @Transactional
    public class UserServiceImpl implements UserService{
         
        private static final AtomicLong counter = new AtomicLong();
         
        private static List users;
         
        static{
            users= populateDummyUsers();
        }
     
        public List findAllUsers() {
            return users;
        }
         
        public User findById(long id) {
            for(User user : users){
                if(user.getId() == id){
                    return user;
                }
            }
            return null;
        }
         
        public User findByName(String name) {
            for(User user : users){
                if(user.getName().equalsIgnoreCase(name)){
                    return user;
                }
            }
            return null;
        }
         
        public void saveUser(User user) {
            user.setId(counter.incrementAndGet());
            users.add(user);
        }
     
        public void updateUser(User user) {
            int index = users.indexOf(user);
            users.set(index, user);
        }
     
        public void deleteUserById(long id) {
             
            for (Iterator iterator = users.iterator(); iterator.hasNext(); ) {
                User user = iterator.next();
                if (user.getId() == id) {
                    iterator.remove();
                }
            }
        }
     
        public boolean isUserExist(User user) {
            return findByName(user.getName())!=null;
        }
     
        private static List populateDummyUsers(){
            List users = new ArrayList();
            users.add(new User(counter.incrementAndGet(),"Sam",30, 70000));
            users.add(new User(counter.incrementAndGet(),"Tom",40, 50000));
            users.add(new User(counter.incrementAndGet(),"Jerome",45, 30000));
            users.add(new User(counter.incrementAndGet(),"Silvia",50, 40000));
            return users;
        }
     
        public void deleteAllUsers() {
            users.clear();
        }
     
    }

     
    Modelクラス
    package com.websystique.springmvc.model;
     
    public class User {
     
        private long id;
         
        private String name;
         
        private int age;
         
        private double salary;
     
        public User(){
            id=0;
        }
         
        public User(long id, String name, int age, double salary){
            this.id = id;
            this.name = name;
            this.age = age;
            this.salary = salary;
        }
         
        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 int getAge() {
            return age;
        }
     
        public void setAge(int age) {
            this.age = age;
        }
     
        public double getSalary() {
            return salary;
        }
     
        public void setSalary(double salary) {
            this.salary = salary;
        }
     
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + (int) (id ^ (id >>> 32));
            return result;
        }
     
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            User other = (User) obj;
            if (id != other.id)
                return false;
            return true;
        }
     
        @Override
        public String toString() {
            return "User [id=" + id + ", name=" + name + ", age=" + age
                    + ", salary=" + salary + "]";
        }
     
     
    }

     
    クラスの構成
    package com.websystique.springmvc.configuration;
     
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
     
    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "com.websystique.springmvc")
    public class HelloWorldConfiguration {
         
     
    }

     
    クラスの初期化
    package com.websystique.springmvc.configuration;
     
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
     
    public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
      
        @Override
        protected Class>[] getRootConfigClasses() {
            return new Class[] { HelloWorldConfiguration.class };
        }
       
        @Override
        protected Class>[] getServletConfigClasses() {
            return null;
        }
       
        @Override
        protected String[] getServletMappings() {
            return new String[] { "/" };
        }
      
    }

     
    あなたのREST APIにCORSサポートを追加
    REST APIにアクセスすると、「同源ポリシー」の問題に直面する必要があります.
    エラーは次のとおりです.
    ” No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://127.0.0.1:8080′ is therefore not allowed access.” OR” XMLHttpRequest cannot load http://abc.com/bla. Origin http://localhost:12345 is not allowed by Access-Control-Allow-Origin.”
     
    一般的に、サーバ側では、応答に追加のCORSアクセス制御ヘッダを返し、ドメイン間リンクを実現します.
    Springでは、簡単なフィルタを書いて、応答ごとにCORSフィーチャーヘッダを追加することができます.
    package com.websystique.springmvc.configuration;
     
    import java.io.IOException;
     
    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.HttpServletResponse;
     
     
    public class CORSFilter implements Filter {
     
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            System.out.println("Filtering on...........................................................");
            HttpServletResponse response = (HttpServletResponse) res;
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
            chain.doFilter(req, res);
        }
     
        public void init(FilterConfig filterConfig) {}
     
        public void destroy() {}
     
    }

     
    Spring構成に追加する必要があります.
    package com.websystique.springmvc.configuration;
     
    import javax.servlet.Filter;
     
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
     
    public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
      
        @Override
        protected Class>[] getRootConfigClasses() {
            return new Class[] { HelloWorldConfiguration.class };
        }
       
        @Override
        protected Class>[] getServletConfigClasses() {
            return null;
        }
       
        @Override
        protected String[] getServletMappings() {
            return new String[] { "/" };
        }
         
        @Override
        protected Filter[] getServletFilters() {
            Filter [] singleton = { new CORSFilter()};
            return singleton;
        }
      
    }

     
    ソースのダウンロード:http://websystique.com/?smd_process_download=1&download_id=1689
    ソースコード(CORS付き)ダウンロード:http://websystique.com/?smd_process_download=1&download_id=1890
     
    特别な说明:このシリーズの教程のある童靴はダウンロードして运行していつも404あるいはxml方式に変えた后に
    orgが欠けています.springframework.web.context.ContextLoaderServiceなど
     
    以下を参照してください.http://blog.csdn.net/w605283073/article/details/52126347
     
     
     
    ----------------------------------------------------
    CSDN 1024プログラマーイベントを参照しています(2019年10月24日まで)
    もし私のブログがあなたに役に立つなら、时間があれば、ブラウザや微信のスキャンコードを歓迎して、私を支持してください.