SpringBoot编程风格的打开方式【获取yml中的参数项、JsonResult实体类的使用、RESTFul风格接口】

1,首先讲一下获取application.yml文件中的参数

其实yml文件中的参数形式是十分有规则的,并且层级关系也很明显。首先我们来看一段代码:

com:
  ysw:
    socail:
      qq:
        appid: qqappid
        appsecret: qqappsecret

假如我们想读取这一段代码的话,首先我们要导入坐标依赖,开启常量读取的功能:

<!-- 开启常量读取功能 -->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-configuration-processor</artifactId>
           <optional>true</optional>
       </dependency>

然后创建一个constant包,下面根据yml的内容创建class文件:
在这里插入图片描述
首先我们来定义BootProperties文件,这个文件主要是用于指定前缀内容的,是我们的主要配置类,然后再将这个配置类注入容器中去,再在其它类中使用@Autowired就可以获取里面的内容了,因为在application.yml文件中,我们定义的是com - ysw - social - qq,所以这个配置文件中定义好了social的前缀部分,如果我们想在这个配置文件中引用的话就使用social进行getter/setter即可:

package com.ysw.constant;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

//这个是配置类,采用封装的方式来进行

//这个是定义我们的前缀的
@ConfigurationProperties(prefix = "com.ysw")
//把这个注入容器
@Configuration
public class BootProperties {

    private SocialProperties socail;

    public SocialProperties getSocail() {
        return socail;
    }

    public void setSocail(SocialProperties socail) {
        this.socail = socail;
    }
}

然后再看我们的SocialProperties,因为SocailProperties文件中要对应application.yml文件,这里social目录下有个qq,同理设置qq进行getter/setter:

package com.ysw.constant;

public class SocialProperties {

    private QQProperties qq;

    public QQProperties getQq() {
        return qq;
    }

    public void setQq(QQProperties qq) {
        this.qq = qq;
    }
}

最后看到我们的qq这个属性中,是包含两个属性内容的,分别是appid、appsecret,因此同样地在这个QQProperties文件中设置两个变量,使用getter/setter即可:

package com.ysw.constant;

public class QQProperties {

    private String appid;
    private String appsecret;

    public String getAppid() {
        return appid;
    }

    public void setAppid(String appid) {
        this.appid = appid;
    }

    public String getAppsecret() {
        return appsecret;
    }

    public void setAppsecret(String appsecret) {
        this.appsecret = appsecret;
    }
}

在使用的时候,因为我们的BootProperties文件已经定义为了配置类,所以要使用@Autowired来提取容器中的对象,然后通过链式编程不断地get出来即可。

    @Autowired
    private BootProperties bootProperties;

    @GetMapping("/getAllss")
    public void test(){
        System.out.println(bootProperties.getSocail().getQq().getAppid());
        System.out.println(bootProperties.getSocail().getQq().getAppsecret());
    }

2,使用JSONResult的方式在Controller层返回一个规范的参数

其实这个返回JSONResult形式的参数在平时我们也很常见,在我们浏览器的请求头的内容里面我们也可以看到类似于这种的返回形式的内容,比如状态码(200表示成功)、返回内容Content(数据内容)、返回信息内容…这里我们就可以直接自己定义一个JSONResult.java实体类(这里无非就是成功的时候,指定好了状态码和成功的信息,但是data的内容需要传入而已;失败的时候就指定data的内容为null,但是状态码和错误信息需要我们来自定义)。

package com.ysw.domain;

/**
 * 专门返回给前端的
 *
 *      返回200表示成功,其他都是失败
 *
 *
 *
 */
public class JsonResult {

    private Integer status;
    private Object data;
    private String msg;

    //静态资源构造器 - 成功
    public static JsonResult isOk(Object data){
        //这里意思其实是如果成功了,我们是需要使用data数据的,所以直接传data进来,其他的是默认的数据内容
        return new JsonResult(200,data,"request success");
    }

    //静态资源构造器 - 失败
    public static JsonResult isError(Integer status,String msg){
        //如果失败了,data是空的,但是状态码和错误信息需要自己定义
        return new JsonResult(status,null,msg);
    }

    //有参构造器
    public JsonResult(Integer status, Object data, String msg) {
        this.status = status;
        this.data = data;
        this.msg = msg;
    }

    //无参构造器
    public JsonResult() {

    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
Controller层
//这里是指定了传入一个Json的User对象,然后就会调用这个新增用户的方法
    @PostMapping
    public JsonResult addUser(@RequestBody User user){
        //传入数据库
        return JsonResult.isOk(user);
    }

    //这里是更新用户,如上述一样要传入一个User对象
    @PutMapping
    public JsonResult updateUser(@RequestBody User user){
        return JsonResult.isOk(user);
    }

    @DeleteMapping("/{id}")
    public JsonResult deleteUser(@PathVariable Integer id){
        return JsonResult.isOk(id);
    }

3,RESTFul风格的API自定义

其实RESTFul风格的API更接近于我们实际工作的应用开发,因为在RESTFul风格中,增删改查都可以定义为对应的四种状态:

  • 新增数据 PostMapping
  • 删除数据 DeleteMapping
  • 修改数据 PutMapping
  • 查询数据 GetMapping

如果我们的Controller层返回的都是JSON对象的话,我们只需要使用@RestController来替代@Controller@ResponseBody两个标签。

package com.ysw.con	troller;

import com.ysw.dao.UserDao;
import com.ysw.domain.JsonResult;
import com.ysw.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 返回的Api一定是json
 * /user/regist
 * /user/login
 *
 * RESTFul的设计思想是将所有的操作都认为是对数据库资源的操作
 *
 * 针对资源的操作分为四种:增删改查
 * 增:POST
 * 删:DELETE
 * 更:PUT
 * 查:GET
 *
 */
@RestController
@RequestMapping("/user")
public class DemoRestConrtoller {

    @Autowired
    private UserDao userDao;

    /**
     * 这种是直接获取全部的user
     *
     * @return
     */
    @GetMapping
    public JsonResult getAll(){
        List<User> lists = userDao.findAll();
        //这里成功了只需要把data传进JsonResult中,这里面是带有data数据的,并且status和msg都有默认值
        return JsonResult.isOk(lists);
    }

    //查询一个
    @GetMapping("/{id}")
    public JsonResult getById(@PathVariable Integer id){
        //这里如果说成功的话我们只需要传入data进封装好的JsonResult中,成功是带有定义好的status和msg的
        return JsonResult.isOk(userDao.findById(id));
    }

    //这里是指定了传入一个Json的User对象,然后就会调用这个新增用户的方法
    @PostMapping
    public JsonResult addUser(@RequestBody User user){
        //传入数据库
        return JsonResult.isOk(user);
    }

    //这里是更新用户,如上述一样要传入一个User对象
    @PutMapping
    public JsonResult updateUser(@RequestBody User user){
        return JsonResult.isOk(user);
    }

    @DeleteMapping("/{id}")
    public JsonResult deleteUser(@PathVariable Integer id){
        return JsonResult.isOk(id);
    }

}

版权声明:本文为qq_43097201原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。