JavaWeb-RESTful(二)_使用SpringMVC开发RESTful_上

 

 

  JavaWeb-RESTful(一)_RESTful初认识  传送门

  JavaWeb-RESTful(二)_使用SpringMVC开发RESTful_上  传送门

  JavaWeb-RESTful(三)_使用SpringMVC开发RESTful_下  传送门

  项目已上传至github  传送门 

 

  Learn

     一、实现一个成功的SpringMVC单元测试类

    二、RequestParam注解:

    三、JsonView注解

 

 

  创建SpringBoot项目  传送门

  

  【 添加Spring Web Starter,Spring Data JPA,Spring Security,Thymeleaf,Spring Data Elasticsearch,Cloud OAuth2,Spring Session,MySQL Driver,H2 Database依赖】 

 

 

一、实现一个成功的SpringMVC单元测试类

  在MainController.java中向服务器以Json格式发起一个请求,并反回两个期望

  期望一:期望服务器返回状态码为200

  期望二:期望服务器返回json中的数组长度为3

        @Test
        //查询user
        public void test() throws Exception
        {
            //发起一个Get请求
            mockMvc.perform(MockMvcRequestBuilders.get("/user")
                    //json的形式发送一个请求
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    //期望服务器返回什么(期望返回的状态码为200)
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    //期望服务器返回json中的数组长度为3
                    .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
            
        }

 

 

 

 

package com.Gary.GaryRESTful;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GaryResTfulApplication {

    public static void main(String[] args) {
        SpringApplication.run(GaryResTfulApplication.class, args);
    }

}
GaryResTfulApplication.java

 

package com.Gary.GaryRESTful.controller;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;



//这是SpringBoot测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class MainController {

        @Autowired
        private WebApplicationContext webApplicationContext;
            
        //SpringMV单元测试独立测试类
        private MockMvc mockMvc;
        
        
        @Before
        public void before()
        {
            //创建独立测试类
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        }
        
        
        @Test
        //查询user
        public void test() throws Exception
        {
            //发起一个Get请求
            mockMvc.perform(MockMvcRequestBuilders.get("/user")
                    //json的形式发送一个请求
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    //期望服务器返回什么(期望返回的状态码为200)
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    //期望服务器返回json中的数组长度为3
                    .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
            
        }
        
}
MainController.java

 

package com.Gary.GaryRESTful.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.Gary.GaryRESTful.dto.User;

//表示这个Controller提供R二十天API
@RestController
public class UserController {

    
    @RequestMapping(value="/user",method = RequestMethod.GET)
    public List<User> query()
    {
        //满足期望服务器返回json中的数组长度为3
        List<User> list = new ArrayList<>();
        list.add(new User());
        list.add(new User());
        list.add(new User());
        return list;
    }
    
}
UserController.java

 

package com.Gary.GaryRESTful.dto;

public class User {


    private String username;
    private String password;
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}
User.java

 

 

二、RequestParam注解:

  @RequestParam 获取请求参数的值

  在MainController.java中通过param方法给Get请求添加参数

        @Test
        //查询user
        public void test() throws Exception
        {
            //发起一个Get请求
            mockMvc.perform(MockMvcRequestBuilders.get("/user")
                    .param("username", "Gary")
                        //json的形式发送一个请求
                        .contentType(MediaType.APPLICATION_JSON_UTF8))
                        //期望服务器返回什么(期望返回的状态码为200)
                        .andExpect(MockMvcResultMatchers.status().isOk())
                        //期望服务器返回json中的数组长度为3
                        .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
            
        }

 

  在UserController.java中通过@RequestParam注入username参数,并通过System.out.println(username)输出username中的值

    @RequestMapping(value="/user",method = RequestMethod.GET)
    /*
     * default value     默认
     * name             请求的名字
     * required            是否是必须的,true
     * value            别名
     * 
     * */
    public List<User> query(@RequestParam(name="username",required=false) String username)
    {
        System.out.println(username);
        //满足期望服务器返回json中的数组长度为3
        List<User> list = new ArrayList<>();
        list.add(new User());
        list.add(new User());
        list.add(new User());
        return list;
    }

 

 

 

package com.Gary.GaryRESTful.controller;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;



//这是SpringBoot测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class MainController {

        @Autowired
        private WebApplicationContext webApplicationContext;
            
        //SpringMV单元测试独立测试类
        private MockMvc mockMvc;
        
        
        @Before
        public void before()
        {
            //创建独立测试类
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        }
        
        
        @Test
        //查询user
        public void test() throws Exception
        {
            //发起一个Get请求
            mockMvc.perform(MockMvcRequestBuilders.get("/user")
                    .param("username", "Gary")
                        //json的形式发送一个请求
                        .contentType(MediaType.APPLICATION_JSON_UTF8))
                        //期望服务器返回什么(期望返回的状态码为200)
                        .andExpect(MockMvcResultMatchers.status().isOk())
                        //期望服务器返回json中的数组长度为3
                        .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
            
        }
        
}
MainController.java

 

package com.Gary.GaryRESTful.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.Gary.GaryRESTful.dto.User;

//表示这个Controller提供R二十天API
@RestController
public class UserController {

    
    @RequestMapping(value="/user",method = RequestMethod.GET)
    public List<User> query(@RequestParam String username)
    {
        System.out.println(username);
        //满足期望服务器返回json中的数组长度为3
        List<User> list = new ArrayList<>();
        list.add(new User());
        list.add(new User());
        list.add(new User());
        return list;
    }
    
    
    //@RequestParam
    
}
UserController.java

 

  如果需要访问用户详细信息,在MainController.java中添加getInfo()方法,发起一个get请求去查看用户详情

        @Test
        public void getInfo() throws Exception
        {
            //发起一个get请求,查看用户详情
            mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("Gary"));
        }

 

  在UserController.java中添加一个getInfo()方法,去接收该请求

    @RequestMapping(value="/user/{id}",method= RequestMethod.GET)
    //将@PathVariable路径中的片段映射到java代码中    
    public User getInfo(@PathVariable String id)
    {
        User user = new User();
        user.setUsername("Gary");
        return user;
    }

 

 

 

package com.Gary.GaryRESTful;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GaryResTfulApplication {

    public static void main(String[] args) {
        SpringApplication.run(GaryResTfulApplication.class, args);
    }

}
GaryResTfulApplication.java

 

package com.Gary.GaryRESTful.controller;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;



//这是SpringBoot测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class MainController {

        @Autowired
        private WebApplicationContext webApplicationContext;
            
        //SpringMV单元测试独立测试类
        private MockMvc mockMvc;
        
        
        @Before
        public void before()
        {
            //创建独立测试类
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        }
        
        
        @Test
        //查询user
        public void test() throws Exception
        {
            //发起一个Get请求
            mockMvc.perform(MockMvcRequestBuilders.get("/user")
                    .param("username", "Gary")
                        //json的形式发送一个请求
                        .contentType(MediaType.APPLICATION_JSON_UTF8))
                        //期望服务器返回什么(期望返回的状态码为200)
                        .andExpect(MockMvcResultMatchers.status().isOk())
                        //期望服务器返回json中的数组长度为3
                        .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
            
        }
        
        @Test
        public void getInfo() throws Exception
        {
            //发起一个get请求,查看用户详情
            mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("Gary"));
        }
}
MainController.java

 

package com.Gary.GaryRESTful.controller;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.Gary.GaryRESTful.dto.User;

//表示这个Controller提供R二十天API
@RestController
public class UserController {

    
    @RequestMapping(value="/user",method = RequestMethod.GET)
    /*
     * default value     默认
     * name             请求的名字
     * required            是否是必须的,true
     * value            别名
     * 
     * */
    public List<User> query(@RequestParam(name="username",required=false) String username)
    {
        System.out.println(username);
        //满足期望服务器返回json中的数组长度为3
        List<User> list = new ArrayList<>();
        list.add(new User());
        list.add(new User());
        list.add(new User());
        return list;
    }
    
    @RequestMapping(value="/user/{id}",method= RequestMethod.GET)
    //将@PathVariable路径中的片段映射到java代码中    
    public User getInfo(@PathVariable String id)
    {
        User user = new User();
        user.setUsername("Gary");
        return user;
    }
    
    
    
}
UserController.java

 

package com.Gary.GaryRESTful.dto;

public class User {


    private String username;
    private String password;
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}
User.java

 

 

三、JsonView注解

  @JsonView是Jackson的一个注解,可以用来过滤序列化对象的字段属性,是你可以选择序列化对象哪些属性,哪些过滤掉。

  @JsonView使用步骤:

    1、使用接口来声明多个视图

    2、在值对象的get方法上指定视图

    3、在Controller方法上指定视图

  通过.andReturn().getResponse().getContentAsString()将mockMvc.perform(MockMvcRequestBuilders.get("/user/1")发送的get请求以字符串的格式打印出来

        @Test
        public void getInfo() throws Exception
        {
            //发起一个get请求,查看用户详情
            String str = mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("Gary"))
                    .andReturn().getResponse().getContentAsString();
            
            System.out.println(str);
                    
        }

 

 

 

 

package com.Gary.GaryRESTful.controller;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;



//这是SpringBoot测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class MainController {

        @Autowired
        private WebApplicationContext webApplicationContext;
            
        //SpringMV单元测试独立测试类
        private MockMvc mockMvc;
        
        
        @Before
        public void before()
        {
            //创建独立测试类
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        }
        
        
        @Test
        //查询user
        public void test() throws Exception
        {
            //发起一个Get请求
            mockMvc.perform(MockMvcRequestBuilders.get("/user")
                    .param("username", "Gary")
                        //json的形式发送一个请求
                        .contentType(MediaType.APPLICATION_JSON_UTF8))
                        //期望服务器返回什么(期望返回的状态码为200)
                        .andExpect(MockMvcResultMatchers.status().isOk())
                        //期望服务器返回json中的数组长度为3
                        .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3));
            
        }
        
        @Test
        public void getInfo() throws Exception
        {
            //发起一个get请求,查看用户详情
            String str = mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("Gary"))
                    .andReturn().getResponse().getContentAsString();
            
            System.out.println(str);
                    
        }
}
MainController.java

 

  发现此时输出来的json字符串格式是{"username":"Gary","password":null},但我们此时不希望用户看到password时,就可以用到@JsonView这个注解了

  使用接口声明多个视图

    1)username,password

    2)username

  在值对象的get方法中指定视图

//简单试图 只有一个username
    public interface UserSimpleView{};
    //复杂试图 有username 和   password 
    public interface UserDetailView extends UserSimpleView{};

    private String username;
    private String password;
    
    @JsonView(UserSimpleView.class)
    public String getUsername() {
        return username;
    }
    
    @JsonView(UserDetailView.class)
    public String getPassword() {
        return password;
    }

 

  在controller方法中指定视图

@RequestMapping(value="/user",method = RequestMethod.GET)
    /*
     * default value     默认
     * name             请求的名字
     * required            是否是必须的,true
     * value            别名
     * 
     * */
    @JsonView(User.UserSimpleView.class)
    public List<User> query(@RequestParam(name="username",required=false) String username)
    {
        System.out.println(username);
        //满足期望服务器返回json中的数组长度为3
        List<User> list = new ArrayList<>();
        list.add(new User());
        list.add(new User());
        list.add(new User());
        return list;
        
    }
    
    @RequestMapping(value="/user/{id}",method= RequestMethod.GET)
    //将@PathVariable路径中的片段映射到java代码中    
    @JsonView(User.UserDetailView.class)
    public User getInfo(@PathVariable String id)
    {
        User user = new User();
        user.setUsername("Gary");
        return user;
    }

 

 

 

 

package com.Gary.GaryRESTful;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GaryResTfulApplication {

    public static void main(String[] args) {
        SpringApplication.run(GaryResTfulApplication.class, args);
    }

}
GaryResTfulApplication.java

 

package com.Gary.GaryRESTful.controller;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;



//这是SpringBoot测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class MainController {

        @Autowired
        private WebApplicationContext webApplicationContext;
            
        //SpringMV单元测试独立测试类
        private MockMvc mockMvc;
        
        
        @Before
        public void before()
        {
            //创建独立测试类
            mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        }
        
        
        @Test
        //查询user
        public void test() throws Exception
        {
            //发起一个Get请求
            String str = mockMvc.perform(MockMvcRequestBuilders.get("/user")
                    .param("username", "Gary")
                        //json的形式发送一个请求
                        .contentType(MediaType.APPLICATION_JSON_UTF8))
                        //期望服务器返回什么(期望返回的状态码为200)
                        .andExpect(MockMvcResultMatchers.status().isOk())
                        //期望服务器返回json中的数组长度为3
                        .andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(3))
                        .andReturn().getResponse().getContentAsString();
            
            System.out.println("查询简单试图"+str);
        }
        
        @Test
        public void getInfo() throws Exception
        {
            //发起一个get请求,查看用户详情
            String str = mockMvc.perform(MockMvcRequestBuilders.get("/user/1")
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andExpect(MockMvcResultMatchers.jsonPath("$.username").value("Gary"))
                    .andReturn().getResponse().getContentAsString();
            
            System.out.println("查询复杂试图"+str);
                    
        }
}
MainController.java

 

package com.Gary.GaryRESTful.controller;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.Gary.GaryRESTful.dto.User;
import com.fasterxml.jackson.annotation.JsonView;

//表示这个Controller提供R二十天API
@RestController
public class UserController {

    
    @RequestMapping(value="/user",method = RequestMethod.GET)
    /*
     * default value     默认
     * name             请求的名字
     * required            是否是必须的,true
     * value            别名
     * 
     * */
    @JsonView(User.UserSimpleView.class)
    public List<User> query(@RequestParam(name="username",required=false) String username)
    {
        System.out.println(username);
        //满足期望服务器返回json中的数组长度为3
        List<User> list = new ArrayList<>();
        list.add(new User());
        list.add(new User());
        list.add(new User());
        return list;
        
    }
    
    @RequestMapping(value="/user/{id}",method= RequestMethod.GET)
    //将@PathVariable路径中的片段映射到java代码中    
    @JsonView(User.UserDetailView.class)
    public User getInfo(@PathVariable String id)
    {
        User user = new User();
        user.setUsername("Gary");
        return user;
    }
    
    
    
}
UserController.java

 

package com.Gary.GaryRESTful.dto;

import com.fasterxml.jackson.annotation.JsonView;

public class User {

    //简单试图 只有一个username
    public interface UserSimpleView{};
    //复杂试图 有username 和   password 
    public interface UserDetailView extends UserSimpleView{};

    private String username;
    private String password;
    
    @JsonView(UserSimpleView.class)
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    
    @JsonView(UserDetailView.class)
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}
User.java

 

posted @ 2019-09-09 16:58  Cynical丶Gary  阅读(363)  评论(0编辑  收藏  举报