Spring Boot应用建议及脚手架工程

Posted 盲目的拾荒者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot应用建议及脚手架工程相关的知识,希望对你有一定的参考价值。

规范详细说明

1.遵循标准RESTful API

2.异常采用枚举进行封装(业务内部异常往上抛,返回客户端需要将对应的异常转换为具体的状态的,这里介绍Spring提供的全局异常处理)

package org.niugang.coding.advice;

import lombok.extern.slf4j.Slf4j;
import org.niugang.coding.enums.ExceptionEnum;
import org.niugang.coding.exception.ServiceException;
import org.niugang.coding.vo.ExceptionResult;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.validation.ConstraintViolationException;
import java.util.HashMap;
import java.util.Map;

/**
 * 全部异常处理
 *
 * @author Created by niugang on 2018/12/26/12:19
 */
@ControllerAdvice
@Slf4j
public class BasicExceptionHandler {

    /**
     * 具体业务层异常
     *
     * @param e 业务异常
     * @return ResponseEntity<ExceptionResult>
     */
    @ExceptionHandler(ServiceException.class)
    public ResponseEntity<ExceptionResult> handleException(ServiceException e) {

        /**
         * 响应的状态码,为枚举中定义的状态码
         */
        return ResponseEntity.status(e.getExceptionEnum().value())
                .body(new ExceptionResult(e.getExceptionEnum()));
    }


    /**
     * 业务处理未知异常
     *
     * @param e 异常
     * @return ResponseEntity<ExceptionResult>
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> exceptionResultResponseEntity(Exception e) {
        //所有参数异常
        //在对象上绑定校验如(UserDTO)
        if (e instanceof BindException || e instanceof MethodArgumentNotValidException || e instanceof IllegalArgumentException) {
            log.error("参数校验失败:{}", e);
            return ResponseEntity.status(ExceptionEnum.PARAMS_VALIDATE_FAIL.value())
                    .body(new ExceptionResult(ExceptionEnum.PARAMS_VALIDATE_FAIL));
        }
        //方法上参数校验失败
        if (e instanceof ConstraintViolationException) {
            ConstraintViolationException ex = (ConstraintViolationException) e;
            Map<String, Object> res = new HashMap<>(16);
            res.put("status", HttpStatus.BAD_REQUEST.value());
            res.put("message", ex.getMessage());
            res.put("timestamp", System.currentTimeMillis());
            return ResponseEntity.status(HttpStatus.BAD_REQUEST.value()).body(res);

        }

        log.error("服务器内部异常:{}", e);
        /*
         * 响应的状态码,为枚举中定义的状态码
         */
        return ResponseEntity.status(ExceptionEnum.BUSINESS_DEAL_FAIL.value())
                .body(new ExceptionResult(ExceptionEnum.BUSINESS_DEAL_FAIL));
    }
}
技术图片
  • value 对应响应状态码

  • message 错误描述

@NoArgsConstructor
@AllArgsConstructor
public enum ExceptionEnum {
    /**
     *
     */
    PARAMS_VALIDATE_FAIL(400, "‘参数校验失败"),
    BUSINESS_DEAL_FAIL(500, "‘业务处理失败");
    /**
     * 响应状态码
     */
    int value;
    /**
     * 响应描述
     */
    String message;

    public int value() {
        return this.value;
    }

    public String message() {
        return this.message;
    }
}
技术图片

参数错误对应400状态码

3.遵循严格的pojo,vo,dto(来自阿里java规范)

4.建议提倡使用lomback(让你的代码,更加简洁,干净)

5.对于日志记录采用@Slf4j

以前可能是:

private static final Logger logger = LoggerFactory.getLogger(MeetingInfoController.class);
技术图片

6.对于响应采用ResponseEntity,Spring已经封装好的,在一定程度上是能满足业务场景的

 @PostMapping
public ResponseEntity<Void> save(@Valid @RequestBody  UserDTO userDTO) {
        userService.insert(userDTO);
        return ResponseEntity.ok().build();
    }
技术图片

7.RESTful API对应以下Spring请求注解

  • @GetMapping 查询

  • @PostMapping 新增

  • @PutMapping 修改

  • @DeleteMapping 删除

8.进行必要的参数校验,新增参数校验,普通查询也有必要,如分页查询pageSize不做限制可能导致数据查询异常或慢查询

9.建议直接只用框架自带封装好的API,如RedisTemplate,RabbitTemplate,KafkaTemplate(自己写的通用的可能某些地方考虑不全)

10.使用注解事务@Transactional


import org.springframework.transaction.annotation.Transactional; //spring的注解不是java注解
技术图片

 

源码地址:https://gitee.com/niugangxy/sprigboot-new-coding-standards

                                                                               微信公众号

                                               技术图片技术图片?

                                                                             JAVA程序猿成长之路

                          分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。 

以上是关于Spring Boot应用建议及脚手架工程的主要内容,如果未能解决你的问题,请参考以下文章

Spring Initializr 构建Spring Boot/Cloud工程

微服务构建:Spring Boot

Spring Cloud Spring Boot mybatis分布式微服务云架构使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程

Spring Cloud Spring Boot mybatis分布式微服务云架构使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程

阿里云发布 Spring Boot 新脚手架,真香

Spring Boot的基础知识