一、依赖
1.1 导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional></dependency>
二、目录构造
1.对立返回接口
1.1 枚举状态码定义
package com.ithwx.boot.result;import lombok.Data;/** * @Author 胡文晓 * @ClassName ResultCode * @CreateTime 2022-04-29 17:31 * @Version 1.0 * @Description: 响应码 */@Datapublic class ResultCode { /** * 胜利 */ public static Integer SUCCESS = 200; /** * bad request */ public static Integer BAD_REQUEST = 400; /** * 未认证 */ public static Integer UNAUTHORIZED = 401; /** * 无拜访权限 */ public static Integer FORBIDDEN = 403; /** * 接口不存在 */ public static Integer NOT_FOUND = 404; /** * 办法不容许 */ public static Integer METHOD_NOT_ALLOWED = 405; /** * 参数有效 */ public static Integer PARAMS_IS_INVALID = 1001; /** * 参数为空 */ public static Integer PARAMS_IS_BLANK = 1002; /** * 失败 服务器谬误 */ public static Integer ERROR = 500; }
1.2对立响应体定义
package com.ithwx.boot.result;import lombok.Setter;/** * @Author 胡文晓 * @ClassName ResultVO * @CreateTime 2022-05-01 11:57 * @Version 1.0 * @Description: 对立返回值 */@Setterpublic class ResultVO<T> { /** * 是否胜利 */ private Boolean success; /** * 返回状态码 */ private Integer code; /** * 返回信息 */ private String message; /** * 返回数据 */ private T data ; //私有化无参结构 private ResultVO() {} public static ResultVO success(){ ResultVO r = new ResultVO(); r.setSuccess(true); r.setCode(ResultCode.SUCCESS); r.setMessage("胜利"); return r; } public static ResultVO error(){ ResultVO r = new ResultVO(); r.setSuccess(false); r.setCode(ResultCode.ERROR); r.setMessage("失败"); return r; } //链式编程 public ResultVO success(Boolean success){ this.setSuccess(success); return this; } //链式编程 public ResultVO message(String message){ this.setMessage(message); return this; } //链式编程 public ResultVO code(Integer code){ this.setCode(code); return this; } //链式编程 public ResultVO data(T data){ this.setData(data); return this; }}
2.全局异样解决
2.1自定义异样MyExceptionHandler
package com.ithwx.boot.exception;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/** * @Author 胡文晓 * @ClassName MyExceptionHandler * @CreateTime 2022-05-04 14:42 * @Version 1.0 * @Description: 自定义异样 */@Data@AllArgsConstructor@NoArgsConstructorpublic class MyExceptionHandler extends RuntimeException { private Integer code; //状态码 private String msg; //异样信息}
2.2 全局异样对立解决
package com.ithwx.boot.exception;import com.ithwx.boot.result.ResultVO;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestControllerAdvice;/** * @Author 胡文晓 * @ClassName GlobalExceptionHandler * @CreateTime 2022-05-04 14:28 * @Version 1.0 * @Description: 全局对立异样解决 */@RestControllerAdvice@ResponseBody@Slf4jpublic class GlobalExceptionHandler { //全局异样 @ExceptionHandler(Exception.class) public ResultVO error(Exception e){ log.error("全局异样:",e.getStackTrace()); return ResultVO.error().message("执行了全局异样解决"); } //算术异样 @ExceptionHandler(ArithmeticException.class) public ResultVO error(ArithmeticException e){ log.error("算术异样:",e.getStackTrace()); return ResultVO.error().message("算术异样解决"); } //自定异样 @ExceptionHandler(MyExceptionHandler.class) public ResultVO error(MyExceptionHandler e){ log.error("自定义异样:",e.getStackTrace()); return ResultVO.error().code(e.getCode()).message(e.getMessage()); }}
三、Knife4j配置
3.1 导入依赖
<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>${knife4j-spring-boot-starter.version}</version> </dependency>
3.2 创立Knife4jConfig配置类
import lombok.AllArgsConstructor;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.AutoConfigureAfter;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.data.util.ParameterTypes;import org.springframework.http.ResponseEntity;import org.springframework.plugin.core.PluginRegistry;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;import org.springframework.web.servlet.resource.PathResourceResolver;import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;import org.springframework.web.util.UrlPathHelper;import springfox.documentation.annotations.ApiIgnore;import springfox.documentation.builders.*;import springfox.documentation.schema.ModelRef;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.Contact;import springfox.documentation.service.Parameter;import springfox.documentation.service.RequestParameter;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.DocumentationCache;import springfox.documentation.spring.web.json.Json;import springfox.documentation.spring.web.json.JsonSerializer;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger.web.ApiResourceController;import springfox.documentation.swagger.web.SecurityConfiguration;import springfox.documentation.swagger.web.SwaggerResource;import springfox.documentation.swagger.web.UiConfiguration;import springfox.documentation.swagger2.annotations.EnableSwagger2;import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;import springfox.documentation.swagger2.web.Swagger2ControllerWebMvc;import springfox.documentation.swagger2.web.WebMvcSwaggerTransformationFilter;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import java.util.*;import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE;/** * Swagger2 前端API配置 * * @author chqiu */@Configuration@EnableSwagger2@AutoConfigureAfter({WebMvcConfigurer.class})@AllArgsConstructorpublic class Knife4jConfig { private static final String DEFAULT_PATH = "/swagger"; @Bean public Docket createRestApi() { Docket docket = new Docket(DocumentationType.SWAGGER_2) .apiInfo(new ApiInfoBuilder() .title("CMDB零碎接口文档") .description("CMDB零碎接口文档") .termsOfServiceUrl("http:localhsot:8080") .contact(new Contact("南京DXC团队", "http://localhsot:8080", "")) .version("1.0") .build()) // 分组名称 .groupName("1.0版本").select() // 这里指定Controller扫描包门路 .apis(RequestHandlerSelectors.basePackage("com.xxx.controller")) .paths(PathSelectors.any()) .build() .globalRequestParameters(buildRequestParameterList()); return docket; } //配置token private List<RequestParameter> buildRequestParameterList() { List<RequestParameter> requestParameters = new ArrayList<>(); RequestParameterBuilder requestParameterBuilder = new RequestParameterBuilder(); RequestParameter build = requestParameterBuilder.name("Authorization").description("token").in("header").required(false).build(); requestParameters.add(build); return requestParameters; } /** * SwaggerUI资源拜访 * * @param servletContext * @param order * @return * @throws Exception */ @Bean public SimpleUrlHandlerMapping swaggerUrlHandlerMapping(ServletContext servletContext, @Value("${swagger.mapping.order:10}") int order) throws Exception { SimpleUrlHandlerMapping urlHandlerMapping = new SimpleUrlHandlerMapping(); Map<String, ResourceHttpRequestHandler> urlMap = new HashMap<>(); { PathResourceResolver pathResourceResolver = new PathResourceResolver(); pathResourceResolver.setAllowedLocations(new ClassPathResource("META-INF/resources/webjars/")); pathResourceResolver.setUrlPathHelper(new UrlPathHelper()); ResourceHttpRequestHandler resourceHttpRequestHandler = new ResourceHttpRequestHandler(); resourceHttpRequestHandler.setLocations(Arrays.asList(new ClassPathResource("META-INF/resources/webjars/"))); resourceHttpRequestHandler.setResourceResolvers(Arrays.asList(pathResourceResolver)); resourceHttpRequestHandler.setServletContext(servletContext); resourceHttpRequestHandler.afterPropertiesSet(); //设置新的门路 urlMap.put(DEFAULT_PATH + "/webjars/**", resourceHttpRequestHandler); } { PathResourceResolver pathResourceResolver = new PathResourceResolver(); pathResourceResolver.setAllowedLocations(new ClassPathResource("META-INF/resources/")); pathResourceResolver.setUrlPathHelper(new UrlPathHelper()); ResourceHttpRequestHandler resourceHttpRequestHandler = new ResourceHttpRequestHandler(); resourceHttpRequestHandler.setLocations(Arrays.asList(new ClassPathResource("META-INF/resources/"))); resourceHttpRequestHandler.setResourceResolvers(Arrays.asList(pathResourceResolver)); resourceHttpRequestHandler.setServletContext(servletContext); resourceHttpRequestHandler.afterPropertiesSet(); //设置新的门路 urlMap.put(DEFAULT_PATH + "/**", resourceHttpRequestHandler); } urlHandlerMapping.setUrlMap(urlMap); //调整DispatcherServlet对于SimpleUrlHandlerMapping的排序 urlHandlerMapping.setOrder(order); return urlHandlerMapping; } /** * SwaggerUI接口拜访 */ @Controller @ApiIgnore @RequestMapping(DEFAULT_PATH) public static class SwaggerResourceController implements InitializingBean { private final ApiResourceController apiResourceController; private final DocumentationCache documentationCache; private final ServiceModelToSwagger2Mapper mapper; private final JsonSerializer jsonSerializer; private final PluginRegistry<WebMvcSwaggerTransformationFilter, DocumentationType> transformations; private static final String HAL_MEDIA_TYPE = "application/hal+json"; private Swagger2ControllerWebMvc swagger2ControllerWebMvc; public SwaggerResourceController(ApiResourceController apiResourceController, DocumentationCache documentationCache, ServiceModelToSwagger2Mapper mapper, JsonSerializer jsonSerializer, PluginRegistry<WebMvcSwaggerTransformationFilter, DocumentationType> transformations) { this.apiResourceController = apiResourceController; this.documentationCache = documentationCache; this.mapper = mapper; this.jsonSerializer = jsonSerializer; this.transformations = transformations; } @Override public void afterPropertiesSet() throws Exception { swagger2ControllerWebMvc = new Swagger2ControllerWebMvc(documentationCache, mapper, jsonSerializer, transformations); } /** * Swagger API首页地址 * * @return 首页地址 */ @RequestMapping public ModelAndView index() { return new ModelAndView("redirect:" + DEFAULT_PATH + "/doc.html"); } @RequestMapping("/swagger-resources/configuration/security") @ResponseBody public ResponseEntity<SecurityConfiguration> securityConfiguration() { return apiResourceController.securityConfiguration(); } @RequestMapping("/swagger-resources/configuration/ui") @ResponseBody public ResponseEntity<UiConfiguration> uiConfiguration() { return apiResourceController.uiConfiguration(); } @RequestMapping("/swagger-resources") @ResponseBody public ResponseEntity<List<SwaggerResource>> swaggerResources() { return apiResourceController.swaggerResources(); } @RequestMapping(value = "/v2/api-docs", method = RequestMethod.GET, produces = {APPLICATION_JSON_VALUE, HAL_MEDIA_TYPE}) @ResponseBody public ResponseEntity<Json> getDocumentation( @RequestParam(value = "group", required = false) String swaggerGroup, HttpServletRequest servletRequest) { return swagger2ControllerWebMvc.getDocumentation(swaggerGroup, servletRequest); } }}
四、启动类
4.1后盾打印接口地址
import lombok.extern.slf4j.Slf4j;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.core.env.Environment;import org.springframework.transaction.annotation.EnableTransactionManagement;import java.net.InetAddress;import java.net.UnknownHostException;@SpringBootApplication@Slf4j@MapperScan("com.dxc.cmdb.mapper")@EnableTransactionManagementpublic class CMDBMain { public static void main(String[] args) throws UnknownHostException { ConfigurableApplicationContext run = SpringApplication.run(CMDBMain.class, args); Environment env = run.getEnvironment(); String ip = InetAddress.getLocalHost().getHostAddress(); String port = env.getProperty("server.port"); //String path = env.getProperty("server.servlet.context-path"); log.info("\n----------------------------------------------------------\n\t" + "Application is running! Access URLs:\n\t" + "Local: \t\thttp://localhost:" + port + "/\n\t" + "External: \thttp://" + ip + ":" + port +"/\n\t" + "Swagger文档:\thttp://" + ip + ":" + port +"/cmdb/swagger/doc.html\n" + "----------------------------------------------------------"); }}
五、mybatis-plus
5.1 导入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version></dependency>
5.2 yam配置
mybatis-plus: global-config: db-config: logic-delete-value: 1 #逻辑删除值 logic-not-delete-value: 0 #逻辑未删除值 mapper-locations: classpath:mapper/*.xml configuration: #打印sql log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 留神启动类要加:@MapperScan("com.xxx.xxx.mapper")
5.3 代码生成器
5.3.1 导入依赖
<!-- velocity 模板引擎, Mybatis Plus 代码生成器须要 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.3.2</version> </dependency>
5.3.2 新建代码生成器类
import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.core.toolkit.StringPool;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.InjectionConfig;import com.baomidou.mybatisplus.generator.config.*;import com.baomidou.mybatisplus.generator.config.po.TableInfo;import com.baomidou.mybatisplus.generator.config.rules.DateType;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import java.util.ArrayList;import java.util.List;public class CodeGenerator { public static void main(String[] args) { // 1、创立代码生成器 AutoGenerator mpg = new AutoGenerator(); // 2、全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); //我的项目存储门路 //String path ="D:\\ideaworkspace\\cmdb"; gc.setOutputDir(projectPath + "/src/main/java"); //gc.setAuthor("itwenxiao"); gc.setOpen(false); //生成后是否关上资源管理器 gc.setFileOverride(false); //从新生成时文件是否笼罩 //gc.setServiceName("%sService"); //去掉Service接口的首字母I gc.setMapperName("I%sMapper"); gc.setIdType(IdType.ASSIGN_ID); //主键策略 gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型 gc.setSwagger2(true);//开启Swagger2模式 mpg.setGlobalConfig(gc); // 3、数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://127.0.1:3306/cmdb?serverTimezone=GMT%2B8"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("123456"); dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc); // 4、包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.dxc.cmdb"); //pc.setModuleName("eduservice"); //模块名// pc.setController("controller");// pc.setEntity("entity");// pc.setService("service");// pc.setMapper("mapper"); mpg.setPackageInfo(pc); // 自定义配置 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; //如果模板引擎是 velocity String templatePath = "/templates/mapper.xml.vm"; // 自定义输入配置 List<FileOutConfig> focList = new ArrayList<>(); // 自定义配置会被优先输入 focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // 自定义输入文件名 , 如果你 Entity 设置了前后缀、此处留神 xml 的名称会跟着发生变化!! return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); // 配置模板 TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setXml(null); mpg.setTemplate(templateConfig); // 5、策略配置 StrategyConfig strategy = new StrategyConfig(); //对应数据库表名,如果有多表操作就用逗号隔开 strategy.setInclude("sys_cluster_template"); strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略 strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀 strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略 strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作 strategy.setRestControllerStyle(true); //restful api格调控制器 strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符 mpg.setStrategy(strategy); // 6、执行 mpg.execute(); }}