SpringMvc 部分注解的理解

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注解指定注入的是哪一个对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值