前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot Web 开发相关总结

Spring Boot Web 开发相关总结

作者头像
北漂的我
发布2019-05-28 20:01:15
4100
发布2019-05-28 20:01:15
举报
文章被收录于专栏:北漂的我北漂的我

1. 表单验证

首先, 在实体类的需要验证的字段上添加添加验证注解, 验证注解类主要在 validation-api-1.1.0.Final.jar 的 javax.validation.constraints 包下, 以及 hibernate-validator-5.3.6.Final.jar 的 org.hibernate.validator.constraints 包下, 常用验证注解: @Min @Max @Length @Email 等.

代码语言:javascript
复制
public class User {

	private Integer id;
	private String name;
	@Min(value=12,message="年龄不能小于12岁")
	private Integer age;

然后, 在需要验证的参数前加 @Valid 注解, 使用 BindingResult 获取验证不通过的信息

代码语言:javascript
复制
@RestController
public class UserController {

	@PostMapping("/addUser")
	public void getUserList(@Valid User user, BindingResult bindingResult) {
		if(bindingResult.hasErrors()) {
			// 打印出字段验证信息
			System.out.println(bindingResult.getFieldError().getDefaultMessage());
			System.out.println("BBBBBBBBB");
		}
		System.out.println("AAAAAAAAAAA");
	}
}

2. AOP 统一处理请求

首先, 要引入 aop 相关 jar 包

代码语言:javascript
复制
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后, 新建 aop 类

代码语言:javascript
复制
package com.codingos.springboot.aspect;

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.codingos.springboot.controller.UserController.*(..))")
	public void log() {
	}

	/**
	 *  在被切入的方法执行之前执行
	 */
	@Before("log()")
	public void doBefore(JoinPoint joinPoint) {
		logger.info("***************** before aop 执行 ****************");
		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
		// url
		logger.info("url={}", attributes.getRequest().getRequestURL());
		// methond
		logger.info("method={}", attributes.getRequest().getMethod());
		// ip
		logger.info("ip={}", attributes.getRequest().getRemoteAddr());
		// 类方法
		logger.info("class_method={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
		// 参数
		logger.info("args={}", joinPoint.getArgs());
	}

	/**
	 *  在被切入的方法执行之后执行
	 */
	@After("log()")
	public void doAfter() {
		logger.info("************************ after aop 执行 **************************");
	}
	
	/**
	 * 用来获取返回值
	 */
	@AfterReturning(returning = "object",pointcut = "log()")
	public void doAfterReturning(Object object) {
		logger.info("response={}", object.toString());
	}
}

3. 统一返回格式

统一返回实体类

代码语言:javascript
复制
package com.codingos.springboot.common;

public class Result<T> {

	private Integer code;// 正常成功为0,异常失败为1
	private String message;
	private T data;
	
	public Result() {
	}

	public Integer getCode() {
		return code;
	}

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

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public T getData() {
		return data;
	}

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

返回工具类

代码语言:javascript
复制
public class ResultUtil<T> {

	public static <T> Result<T> success(T object) {
		Result<T> result = new Result<>();
		result.setCode(0);
		result.setMessage("成功");
		result.setData(object);
		return result;
	}
	
	public static <T> Result<T> success() {
		Result<T> result = new Result<>();
		result.setCode(0);
		result.setMessage("成功");
		return result;
	}
	
	public static <T> Result<T> error(Integer code, String message) {
		Result<T> result = new Result<>();
		result.setCode(code);
		result.setMessage(message);
		return result;
	}
}

返回状态码 (错误码)

代码语言:javascript
复制
public enum ResultEnum {

	EXCEPTION(-1,"未知异常"),
	SUCCESS(0,"操作正常"),
	ERROR(1,"发生错误");

	private Integer code;
	private String message;
	
	private ResultEnum(Integer code, String message) {
		this.code = code;
		this.message = message;
	}

	public Integer getCode() {
		return code;
	}

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

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
}

4. 统一异常处理

自定义异常

代码语言:javascript
复制
public class CustomException extends RuntimeException {
	private static final long serialVersionUID = 7425266758852563283L;

	private Integer code;

	public CustomException(ResultEnum resultEnum) {
		super(resultEnum.getMessage());
		this.code = resultEnum.getCode();
	}

	public Integer getCode() {
		return code;
	}

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

统一异常处理类 (异常往上抛 , 到controller 层也往外抛)

代码语言:javascript
复制
@ControllerAdvice
public class ExceptionHandle {
	private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);

	@ExceptionHandler(value=Exception.class)
	@ResponseBody
	public Result<Object> handle(Exception e) {
		logger.error(ResultEnum.EXCEPTION.getMessage(), e);
		return ResultUtil.result(ResultEnum.EXCEPTION, e.getMessage());
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档