《2小时学会Spring Boot》(二)_20181015

表单验证

验证功能是在Controller层进行编写

@Min(value = 18,message = "未成年,禁止上网吧")
来自 javax.validation.constraints.Min ,用于定义在实体类的属性上 ,用作约束该属性的范围,其中 value 为值 ,message 为提示信息。

@Valid
来自 javax.validation.Valid ,用于定义在形参上,所标注的参数为一个实体类(类中有相应的验证注解),用来使 @Min 此类注解在代码中生效。

BindingResult 接口
验证的结果会赋在此类上面,通过此类的一系列方法在代码块中进行流程控制。

实体类

@Entity
public class Student {
    @Id
    @GeneratedValue
    private Integer id;
    private String name;
    @Min(value = 18,message = "未成年,禁止上网吧")
    private String age;
    //省略
}

Controller类中的方法

    @PostMapping(value = "/add")
    public Map addStudent(@Valid Student student,
                                         BindingResult bindingResult){
        Map mv = new HashMap<>();
        //如果发生错误
        if(bindingResult.hasErrors()){                                             
            logger.info(bindingResult.getFieldError().getDefaultMessage());
            //验证不通过 返回 null
            return null;                             
        }
        Student stu = studentRepository.save(student);
        mv.put("code",1);
        mv.put("desc","success");
        mv.put("obj",stu);
        return mv;
    }

AOP

编程思想——>面向切面编程
将通用的逻辑从业务逻辑中抽离出来

《2小时学会Spring Boot》(二)_20181015_第1张图片
image.png

pom.xml添加依赖



    org.springframework.boot
    spring-boot-starter-aop

@Aspect
声明当前类为Aop的实现类
@Component
声明当前类为Spring中的一个组件
@Pointcut
设置一个通用的切入点
@Before
方法之前执行
@After
方法之后执行
"execution(public * com.example.demo.controller.StudentController.*(..))"
作为Aop注解的参数,设置执行的方法类型。
   *    : 模糊匹配
(..) : 参数匹配

aop实现类

@Aspect
@Component
public class LoginAspect {
    long startTime;
    long endTime;
    private static Logger logger = LoggerFactory.getLogger(LoginAspect.class);

    @Pointcut("execution(public * com.example.demo.controller.StudentController.*(..))")
    private void point(){
    }

    @Before("point()")//参数为方法名
    public void before(){
        startTime = System.currentTimeMillis();
    }

    @After("point()")
    public void after(){
        endTime = System.currentTimeMillis();
        logger.info("方法执行完毕使用了"+(endTime-startTime)+"ss");
    }
}

AOP 实现 LogBack 打印请求信息与返回结果

/**
 * 从请求上下文中 得到 Request
 */
ServletRequestAttributes attributes =(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();

JoinPoint类
Aspect(AOP)所属类 ,用于访问连接点细节

java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
Signature getSignature():获取连接点的方法签名对象;
java.lang.Object getTarget() :获取连接点所在的目标对象;
java.lang.Object getThis() :获取代理对象本身;

@AfterReturning

@AfterReturning(returning = "object",pointcut = "point()")
定义在方法上,所标注的内容在方法之后执行,通过此注解可获得方法执行完毕之后的返回值。其中returning = "object"作为返回对象实体,pointcut = "point()"作为设置方法切面

/**
 * Created by gf on 2018/10/17.
 */
@Aspect
@Component
public class LoginAspect {

    long startTime;
    long endTime;

    private static Logger logger = LoggerFactory.getLogger(LoginAspect.class);

    @Pointcut("execution(public * com.example.demo.controller.StudentController.*(..))")
    private void point(){
    }

    @Before("point()")//参数为方法名
    public void doBefore(JoinPoint joinPoint){
        startTime = System.currentTimeMillis();
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //url
        logger.info("url={}",request.getRequestURL());
        //ip
        logger.info("ip={}",request.getRemoteAddr());
        //method
        logger.info("method={}",request.getMethod());
        //class_method
        logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+
                    joinPoint.getSignature().getName());
        //arg
        logger.info("arg={}",joinPoint.getArgs());
    }

    @After("point()")
    public void doAfter(){
        endTime = System.currentTimeMillis();
        float var = (float) ((endTime - startTime) / 1000.0);
        logger.info("方法执行完毕使用了"+ var +"ms");
    }

    @AfterReturning(returning = "object",pointcut = "point()")
    public void doAfterReturning(Object object){
        logger.info(object.toString());
    }
}

主键生成UUID(Spring-Data-Jpa)

@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid",strategy = "uuid")
private String id;

项目地址:https://gitee.com/goofyw/spring-boot-demo1/tree/v1.2/

你可能感兴趣的:(《2小时学会Spring Boot》(二)_20181015)