您的位置:首页 > 编程语言 > Java开发

【SpringBoot】web进阶——表单验证,AOP统一处理请求日志,统一异常处理,单元测试

2018-02-28 10:13 2341 查看

表单验证

@valid 注解应用 1 在实体类添加限制条件的注解 并标明返回message
              2 在 请求参数前添加 @valid 注解
@Valid-检验,结果返回到BindingResult对象中
public void **(@Valid Girl girl,BindingResult bindingResult){
if(bindingResult.hasErrors()){
String errmessage = bindingResult.getFieldError().getDefaultMessage();
}
...
}

class Girl(){
@Min(value=18,message="***")
Integer age;
}
关于建包之后出现404错误,有可能是建包的位置不对,建包的文位置应该跟入口启动文件为同一级

AOP统一处理请求日志

AOP(面向切面编程)是一种范式,并不是只有在java中才会出现,   .net C# C艹 中都有实现AOP思想
OOP(面向对象)
首先,需要在pom中引入aop的包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后建立一个类,用
@Aspect
@Component
做注解

然后,在类中需要统一处理的方法,并用@before注释一下需要应用切面的包或者类或者方法
@Before("execution(public * com.quanxian.quanxian.controller.UserController.*(..))")
public void log()
{
System.out.println("111111");
}
通过logger日志来打印控制台信息。logger.info();会打印日志的相关信息。线程号,端口,包名,时间。
@Aspect
@Component
public class HttpAspect {
private final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);

@Pointcut("execution(public * com.example.project.web.CustomerContorller.*(..))")
public void log(){
}
@Before("log()")
public void doBefore(){
logger.info("aaaa");

}
@After("log()")
public void doAfter(){
logger.info("bbbb");
}

}
【aop中获取HttpRequest请求数据:】
//url
//method
//ip
//类方法-使用joinPoint对象取
//参数

【aop中获取方法返回内容】
@AfterReturning(pointcut=***)
public void do_log(Object obj){
//{}为占位
log.info("return={}",obj.toString())
}

统一异常处理

统一异常处理。现在的前端和后端都是分离的,返回的大多数都是json格式的。如果发生异常最好也转化为json格式发送给前端。所以我们必须对抛出去a12b的异常进行统一的格式处理。第一步:@controlleradvice (异常捕获之前的注解)第二步:在方法前面加注解 @ExceptionHandler
spring只会针对RuntimeException进行回滚,而不会对Exception进行回滚
分两种异常------系统异常和自定义异常,通过instanceof判断异常类。
异常情况统一管理,建立枚举类,提高内聚性,逻辑在一个地方处理,为后续更改提供便利。public enum ResultEnum{  ...  }

单元测试

--Service 测试
@RunWith(SpringRunner.class)-表示在测试环境
@SpringBootTest-表示将启动整个spring工程 这两个是类之上加的注解
public class GirkServiceTest{
@Autowired
provate GirlService gservice;

@Test 这个是方法上加的注解
public void findOneTest(){
Girl girl = gservice.findOne(73);
//断言,判断是否正确,测试service通过与否
Assert.assertEquals(new Integer(14),girl.getAge());
}
}
--Controller 测试 对API的一个测试
@RunWith(SpringRunner.class) 表示要在测试环境下跑
@SpringBootTest 表示将启动整个spring工程
@AutoConfigureMockMvc //add
public class GirlControllerTest{
@Autowired
private MockMvc mvc;

@Test
public void girlList()throws Exception{
mvc.perform(MockMvcRequestBuilders.get("/girls"))
//判断请求返回码为200
.andExpect(MockMvcResultMatchers.status().isOk())
//判断返回的内容为abc
.andExpect(MockMvcResultMatchers.content().string("abc"))
}

mvn clean packet -- 命令打包时会自动进行单元测试并返回 结果
mvn clean packet -Dmaven.test.skip=true -- 表示打包时跳过单元测试

}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: