Java阶段四Day05

Java阶段四Day05

关于Controller

  • Spring MVC框架主要解决了接收请求、响应结果、统一处理异常的相关问题,接收请求、响应结果是通过Controller类处理的

  • Spring MVC框架的依赖项:spring-webmvc

  • Spring Boot项目中,使用Spring MVC框架应该添加依赖项:spring-boot-starter-web

  • 当添加以上依赖项后,启用项目时,会自动将项目部署到内置的Tomcat,并启用Tomcat,默认占用8080端口,可在配置文件中,可以通过server.port属性指定服务端口号,例如:

    server:
     port: 9080
    
  • 开发Controller层时,至少需要:

    • 接收请求,并调用Service处理请求
    • 使用全局异常处理器,统一处理异常
    • 使用Knife4j框架,生成在线API文档
    • 配置Knife4j的API文档显示的文本
    • 使用Spring Validation检验请求参数
  • 在满足基础理论情况下以查询为主的用GET,增删改使用POST,设计敏感数据的使用POST,如登录查询用户名和密码

关于MockMvc

  • 对模块进行集成测试时,通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,测试会变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,所以为了对Controller进行测试,引入MockMVC
  • MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便
@Test
@Sql(scripts = {"classpath:/sql/truncate_tag.sql"})
@Sql(scripts = "classpath:/sql/truncate_tag.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
void addNew() throws Exception {
    String url = "/content/tags/add-new";
    String name = "新增标签类别";
    String enable = "1";
    String sort = "88";

    mockMvc.perform(MockMvcRequestBuilders.post(url) // 请求方式 + 请求路径(不用虚拟路径)
                    // 携带表单信息
                    .param("name", name)
                    .param("enable", enable)
                    .param("sort", sort)
                    //接收 响应内容类型 
                    .accept(MediaType.APPLICATION_JSON))
        //断言:判断状态码  status().isBadRequest():400错误请求   status().isOk():正确   status().isNotFound():验证控制器不存在
        .andExpect(MockMvcResultMatchers.status().isOk())
        //追加  控制台打印出请求体
        .andDo(MockMvcResultHandlers.print()
              );
}

关于异常处理

全局异常处理

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    public GlobalExceptionHandler() {
        log.info("创建全局异常处理器对象 GlobalExceptionHandler");
    }

    @ExceptionHandler
    public JsonResult handleException(ServiceException e) {
        log.debug("全局异常处理器开始处理ServiceException异常");
        return JsonResult.fail(e.getServiceCode(), e.getMessage());
    }
}

自定义异常处理

/**
 * 业务异常
 */
public class ServiceException extends RuntimeException {
    @Getter
    private ServiceCode serviceCode;

    public ServiceException(ServiceCode serviceCode, String message) {
        super(message);
        this.serviceCode = serviceCode;
    }
}

兜底处理

@ExceptionHandler
public JsonResult handleThrowable(Throwable e) {
    log.debug("全局异常处理器开始处理Throwable");
    log.debug("异常跟踪信息如下:", e);
    String message = "服务器忙,请稍后再试!【看到这句时,你应该检查服务器端的控制台,并在全局异常处理器中添加处理异常的方法】";
    return JsonResult.fail(ServiceCode.ERROR_UNKNOWN, message);
}

关于统一异常详情可查看这篇文章Java阶段二Day22

关于Knife4j

pom.xml导入依赖

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>2.0.9</version>
</dependency>

Knife4j配置类

Knife4jConfiguration模板

import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

/**
 * Knife4j配置类
 *
 */
@Slf4j
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {

    /**
     * 【重要】指定Controller包路径
     */
    private String basePackage = "指定Controller包路径";
    /**
     * 主机名
     */
    private String host = "主机名";
    /**
     * 标题
     */
    private String title = "标题";
    /**
     * 简介
     */
    private String description = "简介";
    /**
     * 服务条款URL
     */
    private String termsOfServiceUrl = "服务条款URL";
    /**
     * 联系人
     */
    private String contactName = "联系人";
    /**
     * 联系网址
     */
    private String contactUrl = "联系网址";
    /**
     * 联系邮箱
     */
    private String contactEmail = "联系邮箱";
    /**
     * 版本号
     */
    private String version = "版本号";

    @Autowired
    private OpenApiExtensionResolver openApiExtensionResolver;

    public Knife4jConfiguration() {
        log.debug("创建配置类对象:Knife4jConfiguration");
    }

    @Bean
    public Docket docket() {
        String groupName = "1.0.0";
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
            .host(host)
            .apiInfo(apiInfo())
            .groupName(groupName)
            .select()
            .apis(RequestHandlerSelectors.basePackage(basePackage))
            .paths(PathSelectors.any())
            .build()
            .extensions(openApiExtensionResolver.buildExtensions(groupName));
        return docket;
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title(title)
            .description(description)
            .termsOfServiceUrl(termsOfServiceUrl)
            .contact(new Contact(contactName, contactUrl, contactEmail))
            .version(version)
            .build();
    }
}

关于Knife4j详情可查看这篇文章Java阶段二Day21

关于Validation

pom.xml导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Validation配置类

ValidationConfiguration模板

/**
 * Validation配置类
 */
@Slf4j
@Configuration
public class ValidationConfiguration {

    public ValidationConfiguration() {
        log.debug("创建配置类对象:ValidationConfiguration");
    }

    @Bean
    public javax.validation.Validator validator() {
        return Validation.byProvider(HibernateValidator.class)
                .configure() // 开始配置
                .failFast(true) // 配置快速失败
                .buildValidatorFactory() // 构建Validator工厂
                .getValidator(); // 从Validator工厂中获取Validator对象
    }
}

关于Validation详情可查看这篇文章Java阶段二Day22

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天你学Java了吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值