首页 > 代码库 > SpringBoot - 二零一七0421小记

SpringBoot - 二零一七0421小记

一、SpringBoot使用起来比起SpringMVC更便捷,在注解上的小变化,我记录了下面几个:

@Controller + @ResponseBody   =  SpringMVC中用@RestController来代替前面两个注解,通过这个注解,可以将所有的前端http请求放入SpringBoot的Controller容器中,并返回json格式的数据给前端
@RequestMapping(value={"/hello","/hi"},method=RequestMethod.GET)    =   @GetMapping(value=http://www.mamicode.com/{"/hello","/hi"}),在请求的注解上也有变化,例如例子的用Get请求方式可以直接变成@GetMapping(value=http://www.mamicode.com/{"/hello","/hi"}),当然Post请求就可以是@PostMapping等等。
@...Mapping(value="personDelete/{id}") ----->@PathVariable("id") Integer id 在请求的方法名的参数前写@PathVariable可以获取到请求链接中的参数,如请求http://localhost:8080/personDelete/1024,可以获取到id的值为1024
@...Mapping(value="findByName") ------> @RequestParam(value="http://www.mamicode.com/name",required=false) String name 同样,可以通过@RequestParam来获取请求发过来的参数,value值就是要获取的参数的name

二、SpringBoot可以直接对操作数据库中的值进行验证,如:

表单验证
@Min(value=18,message="未成年")    加在实体Entity类的属性上,表示获取的值最小为18

@Valid Person person,BindingResult bindingResult     Controller的 某一个方法上(作为参数),验证结果保存在BindingResult里可通过下面的方法来获取
if(bindingResult.hasErrors()){
            System.out.println(bindingResult.getFieldError().getDefaultMessage());//获取到错误信息 ,当然,也可以返回给前端去,这里获取的值就是“未成年”
            return null;
        }

三、SpringBoot的AOP也是挺好用的,通过我对Spring的了解,似乎SpringBoot和Spring的AOP差不多,到底还是一家人儿。

package com.yyc.aspect;

import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Aspect
@Component
public class HttpAspect {

    private final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);
    
    @Pointcut("execution(public * com.yyc.controller.PersonController.*(..))")
    public void log(){
    }
    
    @Before("log()")
    public void doBefore(JoinPoint joinPoint){ //可以获取到前端发送请求时的一些参数
//        logger.info("1111111111");
        
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request=attributes.getRequest();
        //url
        logger.info("url={}",request.getRequestURI());
        //method
        logger.info("method={}",request.getMethod());
        //ip
        logger.info("ip={}",request.getRemoteAddr());
        //类方法
        logger.info("classMethod={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
        
        //参数
        logger.info("args={}",joinPoint.getArgs());
        
    }
    
    @After("log()")
    public void doAfter(){
        logger.info("2222222222");
    }
    
    @AfterReturning(returning="object",pointcut="log()")
    public void doAfterReturning(Object object){//也可以获取到前端请求后,SpringBoot返回给客户端的一些数据
        logger.info("response={}",object.toString());
    }
}

四、在SpringBoot中同样可以对异常信息进行统一处理,比如,我们有一些方法执行后要给客户端返回一些必要的信息,但是呢,这些信息不统一,很分散,可能对不同的结果返回不同的值,这时候统一异常处理就派上用场了,这样类处理就比较方便了。比如这个方法:

    public void getAge(Integer id) throws Exception{
        Person person = personRepository.findOne(id);
        Integer age=person.getAge();
        if(age < 10 ){
            //返回  你还在上小学吧
            throw new PersonException(ResultEnum.PRIMARY_SCHOOL);//这里用了一个自定义异常,用到枚举来对返回的东西进行封装
        }else if(age >= 10&& age<=16){
            //返回 你可能还在上初中
            throw new PersonException(ResultEnum.MIDDLE_SCHOOL);
        }
    }
    

自定义异常类来捕获异常,注意要继承RuntimeException :

package com.yyc.exception;

import com.yyc.enums.ResultEnum;

public class PersonException extends RuntimeException {
    
    private static final long serialVersionUID = 1L;
    private Integer code;
    
    public PersonException(ResultEnum resultEnum) {
        super(resultEnum.getMsg());
        this.code=resultEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }
    
}

异常的统一管理(照我的理解,就是可以通过这个类来对异常进行统一管理,当产生异常可以返回给客户端json数据):

package com.yyc.handle;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.yyc.entity.Result;
import com.yyc.exception.PersonException;
import com.yyc.utils.ResultUtil;

@ControllerAdvice
public class ExceptionHandle {

    private final static Logger logger= LoggerFactory.getLogger(ExceptionHandle.class);
    
    @ExceptionHandler(value=Exception.class)
    @ResponseBody
    public Result<?> handle(Exception e){
        if(e instanceof PersonException){
            return ResultUtil.error(((PersonException) e).getCode(), e.getMessage());
        }else{
            logger.error("【系统异常】{}",e);
            return ResultUtil.error(-1, "内置错误");
        }
    }
}

五、我们知道,客户端请求,希望的是要我们服务端返回一个固定的json格式,方便解析,一个Result类可以对返回的数据的数据格式定义:

package com.yyc.entity;

public class Result<T> {

    private Integer code;//错误码
    private String msg;//提示信息
    
    private T data;//具体的内容

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data =http://www.mamicode.com/ data;
    }  
}

前面有调用的ResultUtil类,这个类对上面的Result类进行使用和封装,以便其它地方调用:

package com.yyc.utils;

import com.yyc.entity.Result;

public class ResultUtil {

    public static Result success(Object obj){
        Result result=new Result();
        result.setCode(1);
        result.setMsg("成功");
        result.setData(obj);
        return result;
    }
    
    public static Result success(){
        return success(null);
    }
    
    public static Result error(Integer code,String msg){
        Result result=new Result();
        result.setCode(0);
        result.setMsg(msg);
        result.setData(null);
        return result;
    }
}

六、SpringBoot中没有xml来配置,默认用properties文件来配置,但是建议用yml文件配置:

application.yml:

spring:
  profiles:
    active: dev   就像html中的include一样,可以通过spring profiles active来激活或导入另一个yml文件,如:application-dev.yml
 
//对数据库的一些配置 datasource: username: root password: 123 driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/springboot jpa: database-platform: org.hibernate.dialect.MySQL5Dialect hibernate: ddl-auto: update show-sql: true

七、maven的pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>com.yyc</groupId>
    <artifactId>springboot_1</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <name>springboot_1</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>


    <dependency><!--springBoot的热部署插件,devtools,加入这个可以不用每次修改代码重启服务-->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

好了,这就是这两天看springboot的一些收获了吧。就小记一下。

SpringBoot - 二零一七0421小记