创建项目

  • 外源项目导入
    访问SpringBoot快速创建网页 点击此处
  • 使用idea(专业版)创建
    create new project
    Spring Initializr

创建成功后删除.mvn mvnw mvnw.cmd三个文件

项目标准结构

Linux部署项目

  1. 通过jar包的方式 默认使用嵌入式Web容器。

    在Maven页面先将项目clean,然后package即可在target目录下找到相应的jar包

    如果想要跳过Maven中的测试类,可以点击Maven导航栏倒数第三个⚡图标。

    或者使用

    mvn clean package -Dmaven.test.skip=true
    

    将jar包拷贝到服务器,以守护进程的方式去运行jar包

    nohup java -jar test.jar >log.text &
    

    执行完命令,Ctrl + C 退出

    如果想要更行项目,一定要先杀掉旧项目的进程号,然后再执行命令进行部署

    #查看项目进程号
    ps -ef | grep test.jar
    

    部署成功后可以通过下面的命令查看相关日志

    tail -500f log.text
    
  2. 通过war包的方式

    这种方式依赖于外部的tomcat容器,application.properties中关于容器运行端口号的配置将会失效。

    在pom文件中,将打包方式修改为war

    <packaging>war</packaging>
    

    修改启动类,重写初始化方法

    public class ServletInitializer extends SpringBootServletInitializer{
       @Override
       protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){
    	   return builder.sources(BootLaunchApplication.class)
       }
    }
    

    去除嵌入式Tomcat依赖

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
       <exclusions>
    	   <exclusion>
    		   <groupId>org.springframework.boot</groupId>
    		   <artifactId>spring-boot-starter-tomcat</artifactId>
    	   </exclusion>
       </exclusions>
    </dependency>
    

    注意:当你排除了嵌入式的tomcat容器,相关的依赖也会被删除比如Servlet依赖

    然后使用maven先clean然后package,将打成的war包放到tomcat的Webapp目录下即可

Lombok插件使用

Lombok可以帮助开发者减少重复代码提高开发效率,提供相关注解帮助开发者开发

在Idea/Setting/Plugins中搜索并安装Lombok插件

在pom.xml文件中添加Lombok依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
Lombok注解释义
@Data自动生成get、set、equals、canEquals、hashCode、toString方法
@Slf4j引入log日志常量,可以在代码中使用log.info或log.debug打印日志
@Builder支持构建式创建对象,例如User user = User.builder().age(20).name(“MMM”).build()
@AllArgsConstructor全参数构造参数
@NoArgsConstructor无参的构造参数

自定义Http类型转换器

以Excel类型转换器为例

使用org.apache.poi来执行excel相关操作

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>

定义类型转换器

public class StringToExcelConverter extends AbstractHttpMessageConverter<AjaxResponse>{
    //定义目标类型
    private static final MediaType EXCEL_TYPE = MediaType.valueOf("application/vnd.ms-excel");

    public ResponseToExcelConverter(){
        super(EXCEL_TYPE);
    }

    //该类型转换器支持哪些类型的返回值
    @Override
    protected boolean supports(Class aClass) {
        return (AjaxResponse.class == aClass);
    }

    //处理请求数据
    @Override
    protected AjaxResponse readInternal(Class<? extends AjaxResponse> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }

    //如何输出到response
    @Override
    protected void writeInternal(AjaxResponse ajaxResponse, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
        final Workbook workbook = new HSSFWorkbook();

        final Sheet sheet = workbook.createSheet();

        Row row = sheet.createRow(0);

        row.createCell(0).setCellValue("响应结果");
        row.createCell(1).setCellValue("响应内容");

        row = sheet.createRow(1);

        row.createCell(0).setCellValue(ajaxResponse.getMessage());
        row.createCell(1).setCellValue(ajaxResponse.getObj().toString());

        workbook.write(httpOutputMessage.getBody());
    }
}

添加自定义消息转换器到springmvc容器中

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(excelConverter());
    }

    @Bean
    public ResponseToExcelConverter excelConverter(){
        return new ResponseToExcelConverter();
    }
}

Jackson的常用注解

Jackson常用注解注解释义
@JsonProperty()为某一属性替换一个名字
@JsonIgnore()排除某个属性不做序列化
@JsonInclude()排除满足某些条件的元素不做序列化
@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”,timezone=“GMT+8”)定义时间格式
@JsonPropertyOrder()调整序列化参数位置

Junit常用注解

Junit4相关注解注解释义
@Test声明一个测试方法
@BeforeClass标注在静态方法上,在所有测试类执行之前执行
@AfterClass标注在静态方法上,在所有测试类执行之后执行
@Before标注在非静态方法上,在每个测试方法之前执行
@After标注在非静态方法上,在每个测试方法之后执行
@RunWith(SpringRunner.class)类Class定义上
Junit5相关注解注解释义
@Test声明一个测试方法
@BeforeAll标注在静态方法上,在所有测试类之前执行
@AfterAll标注在静态方法上,在所有测试类之后执行
@BeforeEach标注在非静态方法上,在每个测试类之前执行
@AfterEach标注在非静态方法上,在每个测试类之后执行
@ExtendWith(SpringExtension.class)类class定义上
@Slf4j
public class HelloController{
    
    private static MockMvc mockMvc;
    
    
    @BeforeAll
    public void setUp(){
        mockMvc = MockMvcBuilders.standaloneSetup(new HellowController()).build();
    }
    
    
    @Test
    public void addUser() throws Exception{
        String requestBody = "{\n" +
                "   \"id\" : 22,\n" +
                "   \"age\" : 30,\n" +
                "   \"uname\" : \"FFF\",\n" +
                "   \"createTime\" : \"2018-02-21 12:12:12\",\n" +
                "    \"updateTime\" : \"2013-03-23 13:13:13\"\n" +
                "}";
        mockMvc.perform(MockMvcRequestBuilders
                       .request(HttpMethod.POST,"/users")
                       .contentType(MediaType.APPLICATION_JSON).content(requestBody)
                        .accept(MediaType.APPLICATION_JSON)
                       )
            .andExcept(MockMvcResultMatchers.status().isOk())
            .andExcept(MockMvcResultMatchers.jsonPath("$.data.age")).value(20)
            .andDo(print())
            .andResturn();
        mvcResult.getResponse().setCharacterEncoding("UTF-8");
    }
}
@Configuration
@EnableSwagger2
public class Swagger2 {

    //http://localhost:8080/swagger-ui.html
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("使用Swgger2构建api文档")
                .description("对Result风格的测试")
                .termsOfServiceUrl("http://localhost:8888/")
                .version("1.0")
                .build();
    }


    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.jun.spring.relearn"))
                .paths(PathSelectors.regex("/users.*"))
                .build();
    }

}
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class SwaggerExportTest {

    @Test
    public void generateAsciiDocs() throws Exception{
        Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
                .withMarkupLanguage(MarkupLanguage.MARKDOWN)
                .withOutputLanguage(Language.ZH)
                .withPathsGroupedBy(GroupBy.TAGS)
                .withGeneratedExamples()
                .withoutInlineSchema()
                .build();

        Swagger2MarkupConverter.from(new URL("http://localhost:8888/v2/api-docs"))
                .withConfig(config)
                .build()
                .toFile(Paths.get("src/main/resources/docs/markdown"));
    }
}