创建项目
- 外源项目导入
访问SpringBoot快速创建网页 点击此处 - 使用idea(专业版)创建
create new project
Spring Initializr
创建成功后删除.mvn mvnw mvnw.cmd三个文件
项目标准结构
Linux部署项目
通过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
通过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"));
}
}