006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义

一:任务

1.任务

  常用的验证注解

  自定义返回消息

  自定义校验注解

二:Hibernate Validator

1.常见的校验注解

  

  

2.程序

  测试类

 1 /**
 2      * @throws Exception
 3      *  更新程序,主要是校验程序的验证
 4      *
 5      */
 6     @Test
 7     public void whenUpdateSuccess() throws Exception {
 8         //JDK1.8的特性
 9         Date date=new Date(LocalDateTime.now().plusYears(1).
10                 atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
11         System.out.println(date.getTime());
12         String content="{\"id\":\"1\",\"username\":\"tom\",\"password\":null,\"birthday\":"+date.getTime()+"}";
13         String result=mockMvc.perform(MockMvcRequestBuilders.put("/user/1")
14                 .contentType(MediaType.APPLICATION_JSON_UTF8)
15                 .content(content))
16             .andExpect(MockMvcResultMatchers.status().isOk())
17             .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1"))
18             .andReturn().getResponse().getContentAsString();
19         System.out.println("result="+result);
20     }

  User.java

 1 package com.cao.dto;
 2
 3 import java.util.Date;
 4
 5 import javax.validation.constraints.Past;
 6
 7 import org.hibernate.validator.constraints.NotBlank;
 8
 9 import com.fasterxml.jackson.annotation.JsonView;
10
11 public class User {
12     //接口
13     public interface UserSimpleView {};
14     public interface UserDetailView extends UserSimpleView {};    //继承之后,可以展示父的所有
15
16     private String username;
17
18     @NotBlank
19     private String password;
20     private String id;
21     private Date birthday;
22
23     @JsonView(UserSimpleView.class)
24     public String getUsername() {
25         return username;
26     }
27     public void setUsername(String username) {
28         this.username = username;
29     }
30
31     @JsonView(UserDetailView.class)
32     public String getPassword() {
33         return password;
34     }
35     public void setPassword(String password) {
36         this.password = password;
37     }
38
39     @JsonView(UserSimpleView.class)
40     public String getId() {
41         return id;
42     }
43     public void setId(String id) {
44         this.id = id;
45     }
46
47     @Past
48     @JsonView(UserSimpleView.class)
49     public Date getBirthday() {
50         return birthday;
51     }
52     public void setBirthday(Date birthday) {
53         this.birthday = birthday;
54     }
55
56 }

  控制类

 1 @PutMapping("/{id:\\d+}")
 2     public User update(@Valid @RequestBody User user,BindingResult errors){
 3         if(errors.hasErrors()) {
 4             errors.getAllErrors().stream().forEach(error->{
 5                 FieldError fieldError=(FieldError)error;
 6                 String message=fieldError.getField()+" : "+fieldError.getDefaultMessage();
 7                 System.out.println(message);
 8             }
 9         );
10
11         }
12
13         System.out.println(user.getId());
14         System.out.println(user.getUsername());
15         System.out.println(user.getPassword());
16         System.out.println(user.getBirthday());
17
18         user.setId("1");
19         return user;
20     }    

  效果:

  

3.完善,自定义提示信息

  打印的提示信息是英文的,这里提示中文的

  在类上进行定义

 1 package com.cao.dto;
 2
 3 import java.util.Date;
 4
 5 import javax.validation.constraints.Past;
 6
 7 import org.hibernate.validator.constraints.NotBlank;
 8
 9 import com.fasterxml.jackson.annotation.JsonView;
10
11 public class User {
12     //接口
13     public interface UserSimpleView {};
14     public interface UserDetailView extends UserSimpleView {};    //继承之后,可以展示父的所有
15
16     private String username;
17
18     @NotBlank(message="密码不能为空")
19     private String password;
20     private String id;
21     private Date birthday;
22
23     @JsonView(UserSimpleView.class)
24     public String getUsername() {
25         return username;
26     }
27     public void setUsername(String username) {
28         this.username = username;
29     }
30
31     @JsonView(UserDetailView.class)
32     public String getPassword() {
33         return password;
34     }
35     public void setPassword(String password) {
36         this.password = password;
37     }
38
39     @JsonView(UserSimpleView.class)
40     public String getId() {
41         return id;
42     }
43     public void setId(String id) {
44         this.id = id;
45     }
46
47     @Past(message="生日必须是过去的时间")
48     @JsonView(UserSimpleView.class)
49     public Date getBirthday() {
50         return birthday;
51     }
52     public void setBirthday(Date birthday) {
53         this.birthday = birthday;
54     }
55
56 }

  效果

  

三:自定义校验注解

1.新建一个Annotation

  

2.程序

  校验类

 1 package com.cao.validator;
 2
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7
 8 import javax.validation.Constraint;
 9 import javax.validation.Payload;
10
11 @Target({ElementType.METHOD,ElementType.FIELD})
12 @Retention(RetentionPolicy.RUNTIME)
13 @Constraint(validatedBy = { MyContraintValidator.class })
14 public @interface MyConstraint {
15     //必写
16     String message() default "{org.hibernate.validator.constraints.NotBlank.message}";
17     Class<?>[] groups() default { };
18     Class<? extends Payload>[] payload() default { };
19     //
20 }

  校验处理类

 1 import javax.validation.ConstraintValidatorContext;
 2
 3 import org.springframework.beans.factory.annotation.Autowired;
 4
 5 import com.cao.service.HelloService;
 6 import com.cao.service.impl.HelloServiceImpl;
 7
 8 public class MyContraintValidator implements ConstraintValidator<MyConstraint,Object> {
 9
10     //这个校验中可以注入spring容器中的任何东西
11     @Autowired
12     public HelloService hello;
13
14     @Override
15     public void initialize(MyConstraint constraintAnnotation) {
16         System.out.println("my constraint init");
17     }
18
19     @Override
20     public boolean isValid(Object value, ConstraintValidatorContext context) {
21         hello.greeting("tomm");
22         System.out.println(value);
23         return false;
24     }
25
26 }

  注入使用的服务

1 package com.cao.service;
2
3 public interface HelloService {
4     public String greeting(String name);
5 }
 1 package com.cao.service.impl;
 2
 3 import org.springframework.stereotype.Service;
 4
 5 import com.cao.service.HelloService;
 6
 7 //成为Spring容器中的服务了
 8 @Service
 9 public class HelloServiceImpl implements HelloService {
10
11     @Override
12     public String greeting(String name) {
13         System.out.println("greeting hello");
14         return "hello "+name;
15     }
16
17 }

  使用,放在User.java上

@MyConstraint(message="这是一个测试")
private String username;

  测试类

 1     /**
 2      * @throws Exception
 3      *  更新程序,主要是校验程序的验证
 4      *
 5      */
 6     @Test
 7     public void whenUpdateSuccess() throws Exception {
 8         //JDK1.8的特性
 9         Date date=new Date(LocalDateTime.now().plusYears(1).
10                 atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
11         System.out.println(date.getTime());
12         String content="{\"id\":\"1\",\"username\":\"Bob\",\"password\":null,\"birthday\":"+date.getTime()+"}";
13         String result=mockMvc.perform(MockMvcRequestBuilders.put("/user/1")
14                 .contentType(MediaType.APPLICATION_JSON_UTF8)
15                 .content(content))
16             .andExpect(MockMvcResultMatchers.status().isOk())
17             .andExpect(MockMvcResultMatchers.jsonPath("$.id").value("1"))
18             .andReturn().getResponse().getContentAsString();
19         System.out.println("result="+result);
20     }

  效果

  

四:用户删除

1.程序

  测试类

 1 /**
 2      *  删除程序,主要是校验程序的验证
 3      * @throws Exception
 4      */
 5     @Test
 6     public void whenDeleteSuccess() throws Exception {
 7         mockMvc.perform(MockMvcRequestBuilders.delete("/user/1")
 8                 .contentType(MediaType.APPLICATION_JSON_UTF8))
 9             .andExpect(MockMvcResultMatchers.status().isOk());
10     }

  控制类

1 @DeleteMapping("/{id:\\d+}")
2     public void delete(@PathVariable String id){
3         System.out.println("id="+id);
4     }    

原文地址:https://www.cnblogs.com/juncaoit/p/9710464.html

时间: 2024-10-08 17:27:37

006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义的相关文章

003 使用SpringMVC开发restful API

一:介绍说明 1.介绍 2.restful api的成熟度 二:编写Restful API的测试用例 1.引入spring的测试框架 在effective pom中查找 2.新建测试包,测试类 3.测试用例程序 1 package com.cao.web.controller; 2 3 import org.junit.Before; 4 import org.junit.Test; 5 import org.junit.runner.RunWith; 6 import org.springfr

004 使用SpringMVC开发restful API二

一:编写用户详情服务 1.任务 @PathVariable隐射url片段到java方法的参数 在url声明中使用正则表达式 @JsonView控制json输出内容 二:@PathVariable [email protected]小测试 测试类 1 @Test 2 public void whenGetInfoSuccess() throws Exception { 3 //发送请求 4 mockMvc.perform(MockMvcRequestBuilders.get("/user/1&qu

使用SpringMVC开发Restful API(2)-使用Filter、Interceptor对请求进行拦截和处理拦截顺序

一 使用Filter拦截请求: 1.使用Filter拦截只需要我们定义一个类并实现javax.servlet.Filter接口,然后将其注册为bean即可. 示例: import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; im

005 使用SpringMVC开发restful API二--处理创建请求

一:主要任务 1.说明 @RequestBody 映射请求体到java方法的参数 日期类型参数的处理 @Valid注解 BindingResult验证请求参数的合法性并处理校验结果 二:@RequestBody [email protected] 测试类 1 /** 2 * @throws Exception 3 * 4 */ 5 @Test 6 public void whenCreateSuccess() throws Exception { 7 String content="{\&quo

flask开发restful api

在此之前,向大家说明的是,我们整个框架用的是flask + sqlalchemy + redis.如果没有开发过web,还是先去学习一下,这边只是介绍如果从开发web转换到开发移动端.如果flask还不是很熟悉,我建议先到这个网站简单学习一下,非常非常简单.http://dormousehole.readthedocs.org/en/latest/ 一直想写一些特别的东西,能让大家学习讨论的东西.但目前网上的很多博客,老么就按照官方文档照本宣读,要么直接搬代码,什么都不说明.我写这个系列的博客,

开发restful api总结的几点小经验

与其说是开发,不如说是打补丁! 是个jesery+spring的restful service,加了一个权限校验部分,做了一些调整. 本来其实很简单的一个事,后来发现,这个代码太霸道.本来传个参数是action_id 这个东西,结果参数名字有如下:action_id,actionID,id 我只能说傻傻分不清楚到底你传的什么, 因为还有其他id,参数名字参考刚才的. 代码中的也是混乱,虽然我知道有很多先人在修改了,但是也不至于这样吧. 吐槽完毕. 1.N次开发restful api主意版本迭代,

前后端分离开发,基于SpringMVC符合Restful API风格Maven项目实战(附完整Demo)!

摘要: 本人在前辈<从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)>一文的基础上,实现了一个基于Spring的符合REST风格的完整Demo,具有MVC分层结构并实现前后端分离,该项目体现了一个具有REST风格项目的基本特征,即具有统一响应结构. 前后台数据流转机制(HTTP消息与Java对象的互相转化机制).统一的异常处理机制.参数验证机制.Cors跨域请求机制以及鉴权机制.此外,该项目的完整源码可移步到我的Github参考:RestSpringMVCDemo.喜欢

flask开发restful api系列(7)-蓝图与项目结构

如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而对整个项目来说,总要有后台管理系统吧,总要有web管理吧,但这些东西不能全部放到view.py.不单单是这样,如果你是一个经验丰富的程序员,你应该知道,一个程序最好只有一个入口点,从这个入口点进去,全是单向的,就像一棵树一样,入口点就在树根,然后蔓延到树干,树枝.树枝和树枝之间最好不要太多交集,也就

ASP.NET Core Web API 开发-RESTful API实现

REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representational State Transfer,简称REST)是Roy Thomas Fielding博士于2000年在他的博士论文 "Architectural Styles and the Design of Network-based Software Architectures" 中提出来的一种万维网软件架构风格. 目前在三种主流的Web服务实现方案中,因为R