Java Web 模板工程

257 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情 

本文将介绍如何搭建一个常用的Java Web模板工程,并将这个模板工程发布到本地仓库。使用模板工程的优势有如下两点。

  1. 快速创建项目,避免重复劳动
  1. 企业内使用版本稳定可控

有什么

本节将讨论一个Java Web项目的模板工程应该有什么组件、有什么包路径。首先就应该有什么组件进行讨论,作为一个Java Web项目至少需要有一个Web开发库,常见的Web开发库有SpringBoot、Quarkus、Micronaut等,按照目前大趋势SpringBoot将作为首选,确定Web开发库后还需要进一步确认其他组件,在Web开发过程中通常还需要数据库作为数据持久化支持,常见的数据库有MySQL、Oracle、PostgreSQL等,这里以MySQL作为首选。确认完成数据库类型后接下来需要确认ORM框架,本模板工程采用MybatisPlus,此外由于项目是Web项目为了便于接口文档的查看在引入Swagger。综上所述模板工程所需依赖信息如下。

  1. Spring Boot
  1. MySQL驱动
  1. MybatisPlus
  1. Swagger
 <?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.github.kop </ groupId >   < artifactId > web-template-project </ artifactId >   < version > 1.0-SNAPSHOT </ version >    < properties >   < maven.compiler.source > 11 </ maven.compiler.source >   < maven.compiler.target > 11 </ maven.compiler.target >   < project.build.sourceEncoding > UTF-8 </ project.build.sourceEncoding >   < mybatis-plus-version > 3.5.2 </ mybatis-plus-version >   < springfox-boot-starter-version > 3.0.0 </ springfox-boot-starter-version >   </ properties >    < dependencyManagement >   < dependencies >   < dependency >   < groupId > org.springframework.boot </ groupId >   < artifactId > spring-boot-dependencies </ artifactId >   < version > 2.7.1 </ version >   < type > pom </ type >   < scope > import </ scope >   </ dependency >   < dependency >   < groupId > com.baomidou </ groupId >   < artifactId > mybatis-plus-boot-starter </ artifactId >   < version > ${mybatis-plus-version} </ version >   </ dependency >   < dependency >   < groupId > io.springfox </ groupId >   < artifactId > springfox-boot-starter </ artifactId >   < version > ${springfox-boot-starter-version} </ version >   </ dependency >   </ dependencies >   </ dependencyManagement >   < dependencies >   < dependency >   < groupId > org.springframework.boot </ groupId >   < artifactId > spring-boot-starter-web </ artifactId >   </ dependency >   < dependency >   < groupId > org.projectlombok </ groupId >   < artifactId > lombok </ artifactId >   </ dependency >   < dependency >   < groupId > com.baomidou </ groupId >   < artifactId > mybatis-plus-boot-starter </ artifactId >   </ dependency >   < dependency >   < groupId > mysql </ groupId >   < artifactId > mysql-connector-java </ artifactId >   </ dependency >   < dependency >   < groupId > io.springfox </ groupId >   < artifactId > springfox-boot-starter </ artifactId >   </ dependency >   </ dependencies >  </ project > 

相关组件已经引入完成,接下来构建相关包,具体包包含如下内容

  1. com.github.kop.template:根包路径,该路径下存放启动类
  1. com.github.kop.template.api:用于存储API接口
  1. com.github.kop.template.module:用于存储Java类
  1. com.github.kop.template.module.biz:用于存储项目业务类
  1. com.github.kop.template.module.entity:用于存储数据库实体类
  1. com.github.kop.template.module.enums:用于存储枚举类
  1. com.github.kop.template.module.ex:用于存储异常类
  1. com.github.kop.template.module.req:用于存储请求参数
  1. com.github.kop.template.module.res:用于存储响应参数
  1. com.github.kop.template.repo:用于存储与数据库交互的类
  1. com.github.kop.template.repo.mapper:用于存储与Mybatis的Mapper接口
  1. com.github.kop.template.service:用于存储具体业务处理类
  1. com.github.kop.template.utils:用于存储工具类
  1. com.github.kop.template.config:用于存储配置类

上述各类包创建完成后需要填入一些关键内容,首先是添加全局共同的响应对象RespVO,具体定义代码如下。

@ApiModel(value = "统一返回对象", description = "统一返回对象")
@Data
public class RespVO<T> {
  private int code;
  private String msg;
  private T data;

  public static <T> RespVO<T> error() {
    RespVO<T> tRespVO = new RespVO<>();
    tRespVO.setCode(4001);
    tRespVO.setMsg("处理异常");
    return tRespVO;
  }

  public static <T> RespVO<T> error(AppHttpCodeEnum appHttpCodeEnum) {
    return error(appHttpCodeEnum.getMsg());
  }

  public static <T> RespVO<T> error(String msg) {
    RespVO<T> tRespVO = new RespVO<>();
    tRespVO.setCode(4001);
    tRespVO.setMsg(msg);
    return tRespVO;
  }

  public static <T> RespVO<T> error(Integer code, String msg) {
    RespVO<T> tRespVO = new RespVO<>();
    tRespVO.setCode(code);
    tRespVO.setMsg(msg);
    return tRespVO;
  }

  public static <T> RespVO<T> success() {
    RespVO<T> tRespVO = new RespVO<>();
    tRespVO.setCode(2001);
    tRespVO.setMsg("处理成功");
    return tRespVO;
  }

  public static <T> RespVO<T> success(T data) {
    RespVO<T> tRespVO = new RespVO<>();
    tRespVO.setCode(2001);
    tRespVO.setMsg("处理成功");
    tRespVO.setData(data);
    return tRespVO;
  }
}

其次条件全局公用的响应枚举,具体定义代码如下

@Getter
public enum AppHttpCodeEnum {
  UPDATE_ERROR(3003, "更新异常"),
  UPDATE_ID_ERROR(3004, "更新时id必填"),
  ;

  int code;
  String msg;

  AppHttpCodeEnum(int code, String msg) {
    this.code = code;
    this.msg = msg;
  }

  public int getCode() {
    return code;
  }

  public String getMsg() {
    return msg;
  }
}

接下来添加全局异常类,具体代码如下。

public class NoceException extends RuntimeException {
  private static final long serialVersionUID = 1L;

  private AppHttpCodeEnum enums;
  private String msg;
  private int code = 3500;

  public NoceException(String msg) {
    super(msg);
    this.msg = msg;
  }

  public NoceException(String msg, Throwable e) {
    super(msg, e);
    this.msg = msg;
  }

  public NoceException(String msg, int code) {
    super(msg);
    this.msg = msg;
    this.code = code;
  }

  public NoceException(String msg, int code, Throwable e) {
    super(msg, e);
    this.msg = msg;
    this.code = code;
  }

  public NoceException(AppHttpCodeEnum enums, String message) {
    super(message);
    this.enums = enums;
    this.code = enums.getCode();
  }

  public NoceException(AppHttpCodeEnum enums) {

    this.enums = enums;
  }

  public AppHttpCodeEnum getEnums() {
    return enums;
  }

  public void setEnums(AppHttpCodeEnum enums) {
    this.enums = enums;
  }

  public String getMsg() {
    return msg;
  }

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

  public int getCode() {
    return code;
  }

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

有了上述准备代码后下面编写全局异常拦截器,具体代码如下。

@RestControllerAdvice
@Slf4j
@RestController
public class ExceptionCatch {

    public static final String ERROR_MSG = "error_msg";

    @ExceptionHandler(Exception.class)
    public RespVO<String> exception(Exception e) {
        log.error(e.getMessage());
        e.printStackTrace();
        return RespVO.error(e.getMessage());
    }

    @ExceptionHandler(NoceException.class)
    public RespVO<String> leadExceptionHandler(NoceException nsException) {
        nsException.printStackTrace();
        return RespVO.error(nsException.getCode(), nsException.getMessage());
    }
}

Maven骨架工程创建

本节将介绍如何创建Maven骨架工程,首先进入到前文制作的项目目录,然后执行mvn archetype:create-from-project命令,执行完成后会在控制台看到类似如下内容即表示创建成功

Archetype project created in /Users/zhangsan/git_repo/kop/web-template-project/target/generated-sources/archetype

接下来需要进入上述控制台中输出的文件位置,cd /Users/zhangsan/git_repo/kop/web-template-project/target/generated-sources/archetype 然后执行mvn install命令完成安装。安装完成后需要将模板信息导入到Maven仓库中进行使用,执行mvn archetype:crawl命令完成导入工作。

Maven骨架工程使用

本节将介绍如何使用Maven骨架工程创建项目,首先执行mvn archetype:generate命令,此时在控制台会输出如下内容(根据个人环境不同如下内容有差异)

Choose archetype:
1: internal -> org.apache.maven.archetypes:maven-archetype-archetype (An archetype which contains a sample archetype.)
2: internal -> org.apache.maven.archetypes:maven-archetype-j2ee-simple (An archetype which contains a simplifed sample J2EE application.)
3: internal -> org.apache.maven.archetypes:maven-archetype-plugin (An archetype which contains a sample Maven plugin.)
4: internal -> org.apache.maven.archetypes:maven-archetype-plugin-site (An archetype which contains a sample Maven plugin site.
      This archetype can be layered upon an existing Maven plugin project.)
5: internal -> org.apache.maven.archetypes:maven-archetype-portlet (An archetype which contains a sample JSR-268 Portlet.)
6: internal -> org.apache.maven.archetypes:maven-archetype-profiles ()
7: internal -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)
8: internal -> org.apache.maven.archetypes:maven-archetype-site (An archetype which contains a sample Maven site which demonstrates
      some of the supported document types like APT, XDoc, and FML and demonstrates how
      to i18n your site. This archetype can be layered upon an existing Maven project.)
9: internal -> org.apache.maven.archetypes:maven-archetype-site-simple (An archetype which contains a sample Maven site.)
10: internal -> org.apache.maven.archetypes:maven-archetype-webapp (An archetype which contains a sample Maven Webapp project.)
11: local -> io.quarkus:quarkus-funqy-amazon-lambda-archetype (${artifactId})
12: local -> io.quarkus:quarkus-amazon-lambda-http-archetype (${artifactId})
13: local -> io.quarkus:quarkus-azure-functions-http-archetype (${artifactId})
14: local -> io.quarkus:quarkus-amazon-lambda-archetype (${artifactId})
15: local -> io.quarkus:quarkus-amazon-lambda-rest-archetype (${artifactId})
16: local -> com.github.kop:web-template-project-archetype (web-template-project)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7: 

在本例中模板项目是com.github.kop:web-template-project-archetype (web-template-project)具体的编号是16,输入16然后按下回车键,根据命令行提示信息输入相关内容即可完成项目创建。