目录
SpringMvc注解
1.@Valid
可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能。(在相关的实体类的相关字段添加用于充当验证条件的注解)
@Valid 注解类型
@Null限制只能为null
@NotNull限制必须不为null
@AssertFalse限制必须为false
@AssertTrue限制必须为true
@DecimalMax(value)限制必须为一个不大于指定值的数字
@DecimalMin(value)限制必须为一个不小于指定值的数字
@Digits(integer,fraction)限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future限制必须是一个将来的日期
@Max(value)限制必须为一个不大于指定值的数字
@Min(value)限制必须为一个不小于指定值的数字
@Past限制必须是一个过去的日期
@Pattern(value)限制必须符合指定的正则表达式
@Size(max,min)限制字符长度必须在min到max之间
@Past验证注解的元素值(日期类型)比当前时间早
@NotEmpty验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
示例代码:
@ApiOperation(value = “Ogg 启动”)
@PostMapping("/start/{id}")
@ApiImplicitParam(paramType = “path”, name = “id”, value = “id”, required = true, dataType = “String”)
public Result startOgg(@PathVariable(“id”) String id, @Valid OggGpProcessDto prorcessDto) throws Exception {
RtOggGp start = this.rtOggGpService.start(id, prorcessDto);
return new Result<>(CODE_SUCCESS, “”, start.getStatus());
}
在OggGpProcessDto类前面有@Valid注解
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = “oggGp process dto”)
public class OggGpProcessDto {
@ApiModelProperty(value = “extractProcess”,dataType = “String”)
@NotBlank(message = “extractProcess不能空”)
private String extractProcess;
@ApiModelProperty(value = “pumpProcess”,dataType = “String”)
@NotBlank(message = “pumpProcess不能空”)
private String pumpProcess;
@ApiModelProperty(value = “replicateProcess”,dataType = “String”)
@NotBlank(message = “replicateProcess不能空”)
private String replicateProcess;
这个类里面就有@NotBlank注解校验
2.@RequestParam
作用:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
示例代码:
//greenplum配置
@GetMapping("/DBs/tableColumn/{id}")
public Result<List> getSelectTablesById(
@PathVariable Integer id,@RequestParam(“oggName”)String oggName) throws Exception {
List rtOggTableInfo = rtOggGpTableService.getRtOggGpTableInfo(id,oggName);
return new Result<>(CODE_SUCCESS, “”, rtOggTableInfo);
}
请求的url就应该是:
http://xxxxxxxxx/etl/rt/ogg/gp/DBs/tableColumn/369?oggName=gp24
有三个参数设置 value required defaultValue
value可以默认不写,之前像上方一样,直接写入“oggName"即默认是value。
required=true 代表这个参数必须给出,如果不给出就会报错。
在required参数为true时,可以给他一个默认值 避免出错。 required=true, defaultValue=“hello”
完整的参数设置可以是:(@RequestParam(value=“name”,required=true,defaultValue=“hello”)String name)
3.@PathVariable
通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)
也就是说不用写成name = “xxx” 而是直接在请求后面跟参数值
示例代码:
@ApiOperation(value = “获取 Ogg 状态 “)
@GetMapping(”/getState/{id}”)
@ApiImplicitParam(paramType = “path”, name = “id”, value = “RT_OGG_Id”, required = true, dataType = “String”)
public Result<List> getOggState(@PathVariable(required = true) String id) throws Exception {
List list = this.rtOggGpService.getState(id);
return new Result<>(CODE_SUCCESS, “”, list);
}
请求的url就是:
http://xxxxxxxxx/etl/rt/ogg/gp/getState/369 (369就是参数id的值)
如果是RequestParam(“id”) 就会变成 getState/id=369
4.@RequestBody
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
示例代码:
@ApiOperation(value = “修改”)
@PutMapping("/{id}")
@ApiImplicitParam(paramType = “path”, name = “id”, value = “RT_OGGid”, required = true, dataType = “String”)
// @PreAuthorize(“hasAuthority(@auth.genAuthCode(’{accessCodePrefix}.update’))”)
public Result grantAuth(@PathVariable(“id”) String id, @RequestBody RtOggGpDto dto) throws Exception {
rtOggGpService.update(id, dto);
return new Result<>(CODE_SUCCESS, “”, “ok”);
}
代码中对于前端返回的RtOggGpDto类前面有 @RequestBody注解
所以前端传回值的时候是写在请求体的body中的,而不是直接跟在请求后面。比如这里面是需要需要某个实体的信息,那么传回来的肯定是整个实体的所有信息。
5.@RestController
@RestController @Controller 都是用来表示Spring某个类的是否可以接收HTTP请求
组合注解,组合了@Controller和@ResponseBody,当我们只开发一个和页面交互数据的控制层的时候可以使用此注解
@RequestMapping("/rt/ogg/gp")
@RestController
@Slf4j
public class OggGpController extends AuthorityController {}
这样这个类返回的数据就都是json数据
在类上使用了@RestController时,类下面的方法就不再需要写@ResponseBody注解了。
6.@ResponseBody
@ResponseBody的作用其实是将java对象转为json格式的数据。(将返回值放在response体内。返回的是数据而不是页面)
是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】
如果没有这个转化的话,前端得到的就是Object对象 ,不方便使用。
而加了ResponseBody,比如传给前端是个User对象,下面有age,name,id等字段
{“id”:“1”, “name”:“张三”, “age”:“22”}
7.@RequestMapping
@RequestMapping用来定义访问的URL,你可以为整个类定义一个@RequestMapping,或者为每个方法指定一个。 把@RequestMapping放在类级别上,这可令它与方法级别上的@RequestMapping注解协同工作,取得缩小选择范围的效果。
//Class
@Api(value = “REST interface RT_OGG_GP”, tags = {“RT_OGG_GP 接口”})
@RequestMapping("/rt/ogg/gp")
@RestController
@Slf4j
public class OggGpController extends AuthorityController {}
//Method
@RequestMapping("/list")
public getAll() {
}
8.@Transactional
看了一下源码:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
首先 他是作用在类或者方法上的。 ElementType.METHOD, ElementType.TYPE
- {@link org.springframework.transaction.interceptor.DefaultTransactionAttribute}* (rolling back on {@link RuntimeException} and {@link Error} but not on checked* exceptions).
这一段是说 只有在抛出RunTimeException异常或者Error类型的异常会导致事务回滚。
太多了 不想读了 头疼 难受呀 读源码还是很重要的 下次读完再更新!!!!
9.@Component
作用:(把普通pojo实例化到spring容器中,相当于配置文件中的)
在别的类中就可以使用@Autowired调用该类的实例。
可以泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
@Component //@Service
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT", fallbackFactory = DeptClientServiceFallBackFactory.class)
public interface DeptClientService {
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long id);
@GetMapping("/dept/list")
public List<Dept> queryAll();
@PostMapping("/dept/add")
public Boolean addDept(Dept dept);
}
@RestController
@RequestMapping("/consumer")
public class DeptConsumerController {
//理解 :消费者 不应该有service层
//RestTemplate 供我们直接调用就可以了 注册到spring中
@Autowired
private DeptClientService deptClientService;
10.@ComponentScan
知识点:本来spring默认扫描范围是启动程序XxxApplication. java所在目录及其下的所有子包。
@ComponentScan 表示开启Component扫描,该注解默认会扫描该类所在的包下所有的配置类(当前类所在目录以及子目录下所有被@Component注解修饰的类)
@Configuration
@ComponentScan(basePackageClasses = {CDPlayer.class, DVDPlayer.class})
public class SoundSystemConfig {
}
@ComponentScan常用参数
value:指定需要扫描的包,如:com.javacode2018
basePackages:作用同value;value和basePackages不能同时存在设置,可二选一
basePackageClasses:指定一些类,spring容器会扫描这些类所在的包及其子包中的类
nameGenerator:自定义bean名称生成器
resourcePattern:需要扫描包中的那些资源,默认是:*/.class,即会扫描指定包中所有的class文件
useDefaultFilters:对扫描的类是否启用默认过滤器,默认为true
includeFilters:过滤器:用来配置被扫描出来的那些类会被作为组件注册到容器中
excludeFilters:过滤器,和includeFilters作用刚好相反,用来对扫描的类进行排除的,被排除的类不会被注册到容器中
lazyInit:是否延迟初始化被注册的bean
11.@Qualifier
@Qualifier作用为限定描述符,用于细粒度选择候选者,说人话就是注入的时候可能发现有多个可注入对象,比如说一个Service接口有3个实现类,分别为impl1,impl2,impl3,你注入service的时候注入的是接口,那么就可以通过@Qualifier(“你要注入的bean的名称”)来选择注入对象。
public interface ImportAndExportService{
}
第一个实现类
@Service("Service1")
public class ImportAndExportServiceImpl1 implements ImportAndExportService {}
第二个实现类
@Service("Service2")
public class ImportAndExportServiceImpl2 implements ImportAndExportService {}
注入时:
@Autowired
@Qualifier("Service2")
private ImportAndExportServiceImpl1 service1;
通过@Qualifier注解指定注入的是哪一个对象