Spring注解的参数
- 格式:pdf
- 大小:70.17 KB
- 文档页数:4
requestparam参数
RequestParam参数是SpringMVC框架中常用的注解之一,它可以用来获取请求参数的值。
RequestParam注解可以添加到方法的参数上,用于指定该参数对应的请求参数名称。
例如,
@RequestParam('userId') String userId,表示获取名为'userId'的请求参数值并赋值给userId变量。
RequestParam注解有以下一些属性:
1. value,用于指定请求参数名称,如果不指定,则默认使用方法参数名称作为请求参数名称。
2. required,用于指定该参数是否必须传递,默认为true。
3. defaultValue,用于指定请求参数的默认值,如果该参数没有传递,则使用默认值。
注意:使用RequestParam注解时,请求参数的名称和方法参数的名称要保持一致,否则会出现获取不到参数值的情况。
RequestParam注解还支持将多个参数值封装为一个集合或数组类型的参数,例如:
1. @RequestParam('ids') List<Integer> ids,表示获取名为'ids'的多个请求参数值并封装为Integer类型的List集合。
2. @RequestParam('names') String[] names,表示获取名为'names'的多个请求参数值并封装为String类型的数组。
除了RequestParam注解,Spring MVC还提供了其他类似的注解,如PathVariable、RequestBody等,可以根据具体情况选择使用。
SpringBoot常见getpost请求参数处理、参数注解校验及参数⾃定义注解校验详解⽬录springboot常见httpget,post请求参数处理PathVaribale获取url路径的数据RequestParam获取请求参数的值注意GET参数校验POSTJSON参数校验⾃定义注解校验总结spring boot 常见http get ,post请求参数处理在定义⼀个Rest接⼝时通常会利⽤GET、POST、PUT、DELETE来实现数据的增删改查;这⼏种⽅式有的需要传递参数,后台开发⼈员必须对接收到的参数进⾏参数验证来确保程序的健壮性GET⼀般⽤于查询数据,采⽤明⽂进⾏传输,⼀般⽤来获取⼀些⽆关⽤户信息的数据POST⼀般⽤于插⼊数据PUT⼀般⽤于数据更新DELETE⼀般⽤于数据删除⼀般都是进⾏逻辑删除(即:仅仅改变记录的状态,⽽并⾮真正的删除数据)@PathVaribale 获取url中的数据@RequestParam 获取请求参数的值@GetMapping 组合注解,是 @RequestMapping(method = RequestMethod.GET) 的缩写@RequestBody 利⽤⼀个对象去获取前端传过来的数据PathVaribale 获取url路径的数据请求URL:localhost:8080/hello/id 获取id值实现代码如下:@RestControllerpublic class HelloController {@RequestMapping(value="/hello/{id}/{name}",method= RequestMethod.GET)public String sayHello(@PathVariable("id") Integer id,@PathVariable("name") String name){return "id:"+id+" name:"+name;}}在浏览器中输⼊地址:localhost:8080/hello/100/hello输出:id:81name:helloRequestParam 获取请求参数的值获取url参数值,默认⽅式,需要⽅法参数名称和url参数保持⼀致localhost:8080/hello?id=1000@RestControllerpublic class HelloController {@RequestMapping(value="/hello",method= RequestMethod.GET)public String sayHello(@RequestParam Integer id){return "id:"+id;}}输出:id:100url中有多个参数时,如:localhost:8080/hello?id=98&&name=helloworld具体代码如下:@RestControllerpublic class HelloController {@RequestMapping(value="/hello",method= RequestMethod.GET)public String sayHello(@RequestParam Integer id,@RequestParam String name){return "id:"+id+ " name:"+name;}}获取url参数值,执⾏参数名称⽅式localhost:8080/hello?userId=1000@RestControllerpublic class HelloController {@RequestMapping(value="/hello",method= RequestMethod.GET)public String sayHello(@RequestParam("userId") Integer id){return "id:"+id;}}输出:id:100注意不输⼊id的具体值,此时返回的结果为null。
springmvc对参数接收的两个注解@RequestParam和
@RequestBody
@RequestParam
作⽤:将请求参数绑定到控制器的⽅法参数上,主要⽤于接收⼏班类型参数
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
value:参数名
required:是否包含该参数,默认为true,表⽰该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,⾃动为false,如果没有传该参数,就使⽤默认值
@RequestBody
@RequestBody主要⽤来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET⽅式⽆请求体,所以使⽤@RequestBody 接收数据时,前端不能使⽤GET⽅式提交数据,⽽是⽤POST⽅式进⾏提交。
在后端的同⼀个接收⽅法⾥,@RequestBody与
@RequestParam()可以同时使⽤,@RequestBody最多只能有⼀个,⽽@RequestParam()可以有多个。
Spring常⽤的⼀些注解说明@Configuration从Spring3.0,@Configuration⽤于定义配置类,可替换xml配置⽂件,被注解的类内部包含有⼀个或多个被@Bean注解的⽅法。
这些⽅法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进⾏扫描,并⽤于构建bean定义。
@Bean@Bean注解⽤于告诉⽅法,产⽣⼀个Bean对象,然后这个Bean对象交给Spring管理。
产⽣这个Bean对象的⽅法Spring只会调⽤⼀次,随后这个Spring将会将这个Bean对象放在⾃⼰的IOC容器中。
SpringIOC 容器管理⼀个或者多个bean,这些bean都需要在@Configuration注解下进⾏创建,在⼀个⽅法上使⽤@Bean注解就表明这个⽅法需要交给Spring进⾏管理。
@Autowired、@Resource@Resource和@Autowired注解都是⽤来实现依赖注⼊的。
只是@AutoWried按by type⾃动注⼊,⽽@Resource默认按byName⾃动注⼊。
♣ @Autowired@Autowired具有强契约特征,其所标注的属性或参数必须是可装配的。
如果没有Bean可以装配到@Autowired所标注的属性或参数中,⾃动装配就会失败,抛出NoSuchBeanDefinitionException.@Autowired可以对类成员变量、⽅法及构造函数进⾏标注,让 spring 完成 bean ⾃动装配的⼯作。
@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
♣ @Resource@Resource是JDK提供的注解,有两个重要属性,分别是name和type。
@Resource依赖注⼊时查找bean的规则既不指定name属性,也不指定type属性,则⾃动按byName⽅式进⾏查找。
主题:requestparam的4个参数在Spring框架中,使用注解RequestParam可以将请求参数绑定到方法的参数上。
这个注解有四个主要的参数,分别是value、required、defaultValue和name。
本文将对这四个参数进行详细的介绍和使用方法。
一、valuevalue参数是RequestParam注解的主要参数,它用来指定请求参数的名称。
当请求参数的名称与方法参数的名称一致时,可以不用显式地指定value参数,直接在方法参数前面加上RequestParam注解即可。
但当请求参数的名称与方法参数的名称不一致时,就需要使用value参数来指定请求参数的名称,示例如下:```javaGetMapping("/user")public String getUserInfo(RequestParam(value = "userId") Long id) {//...}```二、requiredrequired参数用来指定请求参数是否是必须的,默认值为true,表示请求参数是必须的。
如果required为false,表示请求参数是可选的,即可以不传该参数。
示例如下:```javaGetMapping("/user")public String getUserInfo(RequestParam(value = "userId", required = false) Long id) {//...}```三、defaultValuedefaultValue参数用来指定请求参数的默认值,当请求参数未传递时,将会使用defaultValue指定的默认值。
示例如下:```javaGetMapping("/user")public String getUserInfo(RequestParam(value = "userId", defaultValue = "0") Long id) {//...}```四、namename参数用来指定请求参数的名称,与value参数类似。
参数校验Spring的@Valid注解⽤法解析参数校验Spring的@Valid注解@Valid 注解通常⽤于对象属性字段的规则检测。
以新增⼀个员⼯为功能切⼊点,以常规写法为背景,慢慢烘托出 @Valid 注解⽤法详解。
那么,⾸先,我们会有⼀个员⼯对象 Employee,如下:public class Employee {/** 姓名 */public String name;/** 年龄 */public Integer age;public String getName() {return name;}public void setName(String name) { = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}然后 Cotroller 中会有⼀个对应都新增⽅法 add():@Controllerpublic class TestController {@RequestMapping("/add")@ResponseBodypublic String add(Employee employee) {// TODO 保存到数据库return "新增员⼯成功";}}需求变更,要求员⼯名称不能为空,且长度不超过10个字符我们的原始写法:现在规定年龄也是必填项,且范围在1到100岁,那么此时,我们需要增加判定现在员⼯对象 Employee 就 2 个字段,我们就写了 10 多⾏的代码验证,要是有20个字段,岂不是要写 100 多⾏代码?如何解决呢?将验证过程抽成⼀个验证⽅法:但这种⽅式只是抽了⼀个⽅法,有⼀种换汤不换药的感觉,虽然业务⽅法看起来清爽了很多,但书写代码量并没有下降,反⽽还多出了⼀个⽅法。
此时引出 Spring 的 @valid 注解即可:⾸先,我们在 Maven 配置中引⼊ @valid 的依赖:如果你是 springboot 项⽬,那么可以不⽤引⼊了,已经引⼊了,他就存在于最核⼼的 web 开发包⾥⾯。
springboot使用自定义注解注入参数值在Spring Boot中,我们可以使用自定义注解来注入参数值,以简化代码编写和提高可读性。
通过自定义注解,我们可以将一些通用的参数值注入到方法中,而不需要重复的代码。
```javaimport ng.annotation.*;String value(;```接下来,我们需要创建一个注解处理器来实现参数的注入逻辑。
我们可以使用Spring Boot提供的接口HandlerMethodArgumentResolver,并实现其中的resolveArgument和supportsParameter方法。
```javaimport org.springframework.core.MethodParameter;importorg.springframework.web.bind.support.WebDataBinderFactory;importorg.springframework.web.context.request.NativeWebRequest;importorg.springframework.web.method.support.HandlerMethodArgumentReso lver;importorg.springframework.web.method.support.ModelAndViewContainer;public class CustomValueArgumentResolver implements HandlerMethodArgumentResolverpublic boolean supportsParameter(MethodParameter parameter) returnparameter.getParameterAnnotation(CustomValue.class) != null;}public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws ExceptionCustomValue customValue =parameter.getParameterAnnotation(CustomValue.class);String value = customValue.value(;return value;}```最后,我们需要配置Spring Boot,以便它能够使用我们自定义的注解处理器。
SpringBoot使⽤⾃定义注解实现简单参数加密解密(注解+HandlerMethodA。
前⾔我黄汉三⼜回来了,快半年没更新博客了,这半年来的经历实属不易,疫情当头,本⼈实习的公司没有跟员⼯共患难,直接辞掉了很多⼈。
作为⼀个实习⽣,本⼈也被⽆情开除了。
所以本⼈⼜得重新准备找⼯作了。
算了,感慨⼀下,本来想昨天发的,但昨天是清明,哀悼时期,就留到了今天发。
话不多说,直接进⼊正题吧。
这段时间本⼈在写毕设,学校也迟迟没有开学的消息,属实难顶。
本来被开了本⼈只想回学校安度"晚年"算了,毕竟⼯作可以再找,但亲朋好友以后毕业了就很少见了。
所以亲们,⼀定要珍惜⾝边的⼈噢。
因为这篇博⽂是现在本地typora上⾯写好再放过博客园的,格式有点不统⼀博客园的markdown编辑器还不是很好⽤,这点有点头疼还有⼀点是代码格式问题,复制到markdown⼜变乱了我哭了,本来就乱了,再加上博客篇幅的问题⼀挤压,博⽂就乱完了以后更⽂都⽤markdown了,所以关于排版的问题会越来越美化⼀下通过本⽂读者将可以学习到以下内容注解的简单使⽤和解析HandlerMethodArgumentResolver相关部分知识起因写毕设,这周才把后台搭好,还有⼩程序端还没开始。
如题⽬所说,⽤了SpringBoot做后端搭建。
然后也当然应⽤了RESTful风格,当本⼈有⼀个url是/initJson/{id}的时候,直接就把⽤户ID传过来了。
本⼈就想能不能在前端简单把ID加密⼀下,起码不能眼睁睁看着ID直接就传到后端。
虽然只是⼀个毕设,但还是稍微处理⼀下吧,处理的话我选择⽤Base64好了。
本⼈现在是想把前端传的⼀些简单参数,⽤密⽂传到后端再解密使⽤,避免明⽂传输。
当然在真正的环境中,肯定是使⽤更好的⽅案的。
这⾥只是说有那么⼀种思路或者说那么⼀种场景。
给⼤家举个例⼦之后可以抛砖引⽟。
过程1.前端前端传参的时候,加密// encode是Base64加密的⽅法,可以⾃⼰随便整⼀个data.password = encode(pwd);ername= encode(username);这样⼦前端传过去就是密⽂了。
解决springboot项⽬中@Value注解参数值为null的问题1、错误场景:springboot项⽬中在.properties⽂件(.yml)⽂件中配置了属性值,在Bean中使⽤@Value注解引⼊该属性,Bean的构造器中使⽤该属性进⾏初始化,此时有可能会出现属性值为null,造成初始化程序的错误2、错误原因:因为Bean的构造器调⽤是在@Value属性赋值之前进⾏的,所以造成了属性还没有赋值,就被调⽤的情况。
3、解决⽅案:将构造器中需要使⽤的@Value属性作为构造器的参数,确保构造器中使⽤该属性之前,属性已经得到初始化理论先⾏,代码跟上(^_^)(1).yml配置⽂件中配置系统参数值 file.upload-dirfile:upload-dir: /Users/lc/temp/(2)FileStorageService 的构造器需要使⽤使⽤ file.upload-dir 属性@Servicepublic class FileStorageService { /* @Value("${file.upload-dir}") private String uploadDir; */public FileStorageService(@Value("${file.upload-dir}") String uploadDir) throws ServiceException {this.fileStorageLocation = Paths.get(uploadDir).toAbsolutePath().normalize();try {Files.createDirectories(this.fileStorageLocation);} catch (Exception e) {throw new Exception(e);}}}(3)now,问题解决了。
SpringBoot注解解析⼤全(⾮常全哦!)使⽤注解的优势:1.采⽤纯java代码,不在需要配置繁杂的xml⽂件2.在配置中也可享受⾯向对象带来的好处3.类型安全对重构可以提供良好的⽀持4.减少复杂配置⽂件的同时亦能享受到springIoC容器提供的功能⼀、注解详解(配备了完善的释义)------(可采⽤ctrl+F 来进⾏搜索哦~~~~也可以收藏⽹页这样以后就不⽤往复查询了哦)@SpringBootApplication:申明让spring boot⾃动给程序进⾏必要的配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和 @ComponentScan 三个配置。
@ResponseBody:表⽰该⽅法的返回结果直接写⼊HTTP response body中,⼀般在异步获取数据时使⽤,⽤于构建RESTful的api。
在使⽤@RequestMapping后,返回值通常解析为跳转路径,加上@esponsebody后返回结果不会被解析为跳转路径,⽽是直接写⼊HTTP response body中。
⽐如异步获取json数据,加上@Responsebody后,会直接返回json数据。
该注解⼀般会配合@RequestMapping⼀起使⽤。
@Controller:⽤于定义控制器类,在spring项⽬中由控制器负责将⽤户发来的URL请求转发到对应的服务接⼝(service层),⼀般这个注解在类中,通常⽅法需要配合注解@RequestMapping。
@RestController:⽤于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。
@RequestMapping:提供路由信息,负责URL到Controller中的具体函数的映射。
@EnableAutoConfiguration:SpringBoot⾃动配置(auto-configuration):尝试根据你添加的jar依赖⾃动配置你的Spring应⽤。
spring注解之@Import注解的三种使⽤⽅式⽬录@1、@Import注解须知1、@Import只能⽤在类上,@Import通过快速导⼊的⽅式实现把实例加⼊spring的IOC容器中2、加⼊IOC容器的⽅式有很多种,@Import注解就相对很⽜⽪了,@Import注解可以⽤于导⼊第三⽅包,当然@Bean注解也可以,但是@Import注解快速导⼊的⽅式更加便捷3、@Import注解有三种⽤法2、@Import的三种⽤法@Import的三种⽤法主要包括:1、直接填class数组⽅式2、ImportSelector⽅式【重点】3、ImportBeanDefinitionRegistrar⽅式2.1、第⼀种⽤法:直接填class数组直接填对应的class数组,class数组可以有0到多个。
语法如下:@Import({ 类名.class , 类名.class... })public class TestDemo {}对应的import的bean都将加⼊到spring容器中,这些在容器中bean名称是该类的全类名,⽐如com.yc.类名2.2、第⼆种⽤法:ImportSelector⽅式【重点】这种⽅式的前提就是⼀个类要实现ImportSelector接⼝,假如我要⽤这种⽅法,⽬标对象是Myclass这个类,分析具体如下:创建Myclass类并实现ImportSelector接⼝public class Myclass implements ImportSelector {//既然是接⼝肯定要实现这个接⼝的⽅法@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {return new String[0];}}分析实现接⼝的selectImports⽅法中的:1、返回值:就是我们实际上要导⼊到容器中的组件全类名【重点】2、参数: AnnotationMetadata表⽰当前被@Import注解给标注的所有注解信息【不是重点】需要注意的是selectImports⽅法可以返回空数组但是不能返回null,否则会报空指针异常!以上分析完毕之后,具体⽤法步骤如下:第⼀步:创建Myclass类并实现ImportSelector接⼝,这⾥⽤于演⽰就添加⼀个全类名给其返回值public class Myclass implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {return new String[]{"com.yc.Test.TestDemo3"};}}第⼆步:编写TestDemo 类,并标注上使⽤ImportSelector⽅式的Myclass类@Import({TestDemo2.class,Myclass.class})public class TestDemo {@Beanpublic AccountDao2 accountDao2(){return new AccountDao2();}}可以看出,宜春故意挑了个龙套⾓⾊@Bean注解,若对@Bean注解不是很清晰的童鞋可以参考第三步:编写打印容器中的组件测试类/*** 打印容器中的组件测试*/public class AnnotationTestDemo {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(TestDemo.class); //这⾥的参数代表要做操作的类String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();for (String name : beanDefinitionNames){System.out.println(name);}}}第四步:运⾏结果2.3、第三种⽤法:ImportBeanDefinitionRegistrar⽅式同样是⼀个接⼝,类似于第⼆种ImportSelector⽤法,相似度80%,只不过这种⽤法⽐较⾃定义化注册,具体如下:第⼀步:创建Myclass2类并实现ImportBeanDefinitionRegistrar接⼝public class Myclass2 implements ImportBeanDefinitionRegistrar {//该实现⽅法默认为空@Overridepublic void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {}}参数分析:第⼀个参数:annotationMetadata 和之前的ImportSelector参数⼀样都是表⽰当前被@Import注解给标注的所有注解信息第⼆个参数表⽰⽤于注册定义⼀个bean第⼆步:编写代码,⾃定义注册beanpublic class Myclass2 implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {//指定bean定义信息(包括bean的类型、作⽤域...)RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestDemo4.class);//注册⼀个bean指定bean名字(id)beanDefinitionRegistry.registerBeanDefinition("TestDemo4444",rootBeanDefinition);}}第三步:编写TestDemo 类,并标注上使⽤ImportBeanDefinitionRegistrar⽅式的Myclass2类@Import({TestDemo2.class,Myclass.class,Myclass2.class})public class TestDemo {@Beanpublic AccountDao2 accountDao222(){return new AccountDao2();}}第四步:运⾏结果3、@Import注解的三种使⽤⽅式总结第⼀种⽤法:@Import({ 要导⼊的容器中的组件 } ):容器会⾃动注册这个组件,id默认是全类名第⼆种⽤法:ImportSelector:返回需要导⼊的组件的全类名数组,springboot底层⽤的特别多【重点】第三种⽤法:ImportBeanDefinitionRegistrar:⼿动注册bean到容器以上三种⽤法⽅式皆可混合在⼀个@Import中使⽤,特别注意第⼀种和第⼆种都是以全类名的⽅式注册,⽽第三中可⾃定义⽅式。
⾃定义spring参数注解-打破@RequestBody单体限制本⽂主要描述怎样⾃定义类似@RequestBody这样的参数注解来打破@RequestBody的单体限制。
⽬录1 @RequestBody的单体限制2 ⾃定义spring的参数注解3 编写spring的参数注解解析器4 将⾃定义参数注解解析器设置到spring的参数解析器集合中5 指定参数解析器的优先级⼀、@RequestBody的单体限制@RequestBody的作⽤:将请求体中的整体数据转化为对象。
1 @RequestMapping(value = "/body", method = RequestMethod.POST)2public Book testCommon(@RequestBody Book book) {3return book;4 }springmvc具有⼀个参数解析器容器RequestMappingHandlerAdapter.argumentResolvers,该参数的初始化在RequestMappingHandlerAdapter#afterPropertiesSet()1public void afterPropertiesSet() {2 ......3if (this.argumentResolvers == null) {4 List<HandlerMethodArgumentResolver> resolvers = getDefaultArgumentResolvers();5this.argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);6 }7 ......8 }910/**11 * Return the list of argument resolvers to use including built-in resolvers12 * and custom resolvers provided via {@link #setCustomArgumentResolvers}.13*/14private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {15 List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();1617// Annotation-based argument resolution18 resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));19 resolvers.add(new RequestParamMapMethodArgumentResolver());20 resolvers.add(new PathVariableMethodArgumentResolver());21 resolvers.add(new PathVariableMapMethodArgumentResolver());22 resolvers.add(new MatrixVariableMethodArgumentResolver());23 resolvers.add(new MatrixVariableMapMethodArgumentResolver());24 resolvers.add(new ServletModelAttributeMethodProcessor(false));25 resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice));26 resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), this.requestResponseBodyAdvice));27 resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));28 resolvers.add(new RequestHeaderMapMethodArgumentResolver());29 resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));30 resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));31 resolvers.add(new SessionAttributeMethodArgumentResolver());32 resolvers.add(new RequestAttributeMethodArgumentResolver());3334// Type-based argument resolution35 resolvers.add(new ServletRequestMethodArgumentResolver());36 resolvers.add(new ServletResponseMethodArgumentResolver());37 resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice));38 resolvers.add(new RedirectAttributesMethodArgumentResolver());39 resolvers.add(new ModelMethodProcessor());40 resolvers.add(new MapMethodProcessor());41 resolvers.add(new ErrorsMethodArgumentResolver());42 resolvers.add(new SessionStatusMethodArgumentResolver());43 resolvers.add(new UriComponentsBuilderMethodArgumentResolver());4445// Custom arguments46if (getCustomArgumentResolvers() != null) {47 resolvers.addAll(getCustomArgumentResolvers());48 }4950// Catch-all51 resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));52 resolvers.add(new ServletModelAttributeMethodProcessor(true));5354return resolvers;55 }可以看出springmvc的参数解析器容器中存放着内置的参数解析器 + ⾃定义解析器,这⾥边就包括@RequestBody的解析器RequestResponseBodyMethodProcessor,来看⼀下这个解析器的主要⽅法:1 @Override2public boolean supportsParameter(MethodParameter parameter) {3return parameter.hasParameterAnnotation(RequestBody.class);4 }56 @Override7public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,8 NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {9// 这⾥使⽤MappingJackson2HttpMessageConverter将输⼊流body体中的转化为Book对象10 }这⾥注意两点:1、⼀个参数解析器最重要的⽅法有两个:(1)supportsParameter 指定哪些参数使⽤该解析器进⾏解析(2)resolveArgument 对参数进⾏真正的解析操作这也是⾃定义参数解析器需要去实现的两个⽅法(见“三”)2、在解析器容器中,⾃定义解析器是位于内置解析器之后,这个顺序也是解析器的优先级,也就是说假设有⼀个参数同时满⾜两个解析器,只有第⼀个解析器会⽣效,那么怎么去调整这个解析器的顺序呢?(见“五”)好,现在,我们已经⼤致了解了springmvc的参数解析器,以及@RequestBody的解析过程。
SpringMVC注解@RequestParam全⾯解析在此之前,写项⽬⼀直⽤的是@RequestParam(value="aa" required=false)这个注解,但是并不知道它的意思。
现在懂了,特来记录下。
1、可以对传⼊参数指定参数名1 @RequestParam String inputStr2// 下⾯的对传⼊参数指定为aa,如果前端不传aa参数名,会报错3 @RequestParam(value="aa") String inputStr2、可以通过required=false或者true来要求@RequestParam配置的前端参数是否⼀定要传1// required=false表⽰不传的话,会给参数赋值为null,required=true就是必须要有2 @RequestMapping("testRequestParam")3public String filesUpload(@RequestParam(value="aa", required=true) String inputStr, HttpServletRequest request)3、如果@requestParam注解的参数是int类型,并且required=false,此时如果不传参数的话,会报错。
原因是,required=false时,不传参数的话,会给参数赋值null,这样就会把null赋值给了int,因此会报错。
1// required=false表⽰不传的话,会给参数赋值为null,required=true就是必须要有2 @RequestMapping("testRequestParam")3public String filesUpload(@RequestParam(value="aa", required=false) int inputStr, HttpServletRequest request)4若是前端页⾯不传参的话,此处就会报错。
SpringBoot常见getpost请求参数处理参数注解校验及参数自定义注解校验详解在Spring Boot中,处理GET和POST请求参数是非常常见的任务。
Spring Boot提供了多种方式来处理这些请求参数,并支持参数注解校验和参数自定义注解校验。
```java// 处理id参数return "success";``````java// 处理user参数return "success";``````java// 处理user参数return "success";``````javaString message( default "Invalid parameter";Class<?>[] groups( default {};Class<? extends Payload>[] payload( default {};public class CustomValidator implementsConstraintValidator<CustomAnnotation, String>public void initialize(CustomAnnotation annotation)}public boolean isValid(String value, ConstraintValidatorContext context)//校验逻辑return false;}// 处理user参数和customParam参数return "success";```总结起来,Spring Boot提供了多种方式来处理GET和POST请求参数,并支持参数注解校验和自定义注解校验。
通过合理地使用这些功能,我们可以提高代码的可读性和可维护性,并保证应用程序的健壮性和安全性。
spring参数校验注解在写⼀些controller协议的时候,有些时候从前端传过来的参数较多,好的办法是定义⼀个实体类来封装请求参数,但是⽤实体类封装参数后,⽆法对参数值进⾏校验,可以使⽤spring的@Validated 结合java validation、hibernate validation注解进⾏校验。
1.@validated 注解@Validated is org.springframework.validation.annotation.Validated.复制代码@RequestMapping(value = "/regist", method = {RequestMethod.GET, RequestMethod.POST})@ResponseBodypublic Object hualalaRegist(@Validated HualalaRegistVO registVO, BindingResult bindingResult,HttpServletRequest request) throws Exception {if(bindingResult.hasErrors())return new ResultBean<>(HttpStatus.SC_BAD_REQUEST,"请求参数错误",null);...}复制代码增加@Validated 注解后,表⽰需要对其中的参数进⾏校验。
2.java validation 注解复制代码JSR提供的校验注解:@Null 被注释的元素必须为 null@NotNull 被注释的元素必须不为 null@AssertTrue 被注释的元素必须为 true@AssertFalse 被注释的元素必须为 false@Min(value) 被注释的元素必须是⼀个数字,其值必须⼤于等于指定的最⼩值@Max(value) 被注释的元素必须是⼀个数字,其值必须⼩于等于指定的最⼤值@DecimalMin(value) 被注释的元素必须是⼀个数字,其值必须⼤于等于指定的最⼩值@DecimalMax(value) 被注释的元素必须是⼀个数字,其值必须⼩于等于指定的最⼤值@Size(max=, min=) 被注释的元素的⼤⼩必须在指定的范围内@Digits (integer, fraction) 被注释的元素必须是⼀个数字,其值必须在可接受的范围内@Past 被注释的元素必须是⼀个过去的⽇期@Future 被注释的元素必须是⼀个将来的⽇期@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式复制代码3.hiberate validation 注解复制代码@Email 被注释的元素必须是电⼦邮箱地址@Length(min=,max=) 被注释的字符串的⼤⼩必须在指定的范围内@NotEmpty 被注释的字符串的必须⾮空@Range(min=,max=,message=) 被注释的元素必须在合适的范围内@URL(protocol=,host=, port=,regexp=, flags=) 合法的url复制代码主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别:@NotNull 任何对象的value不能为null@NotEmpty 集合对象的元素不为0,即集合不为空,也可以⽤于字符串不为null@NotBlank 只能⽤于字符串不为null,并且字符串trim()以后length要⼤于04. 案例HualalaRegistVO.java复制代码import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import org.hibernate.validator.constraints.NotBlank;import javax.validation.constraints.NotNull;import javax.validation.constraints.Pattern;import java.math.BigDecimal;/***@Author: jiyang@Date: 2018-06-27 13:48*/@Data@AllArgsConstructor@NoArgsConstructorpublic class HualalaRegistVO {@NotBlank@Pattern(regexp = "^\d{11}$", message = "⼿机号码格式错误")String phoneNumber; //⼿机号码@NotBlankString name; //姓名@NotBlankString loanBody;//借款主体@NotBlankString loanBodyId;//借款主体ID@NotNullBigDecimal borrowAmount;//借款⾦额@NotNullBigDecimal turnover;//⽉营业额@NotNullBigDecimal profit; //⽉利润@NotBlankString usage;//⽤途@NotBlank(groups = {A.clss})String groupID;//集团IDString source = ""; //来源String code; //验证码(更换⼿机号码时使⽤)String ipAddress; //ip地址 // 定义两个域 public Interface {}public Interface{}}复制代码controller复制代码@RequestMapping(value = "/regist", method = {RequestMethod.GET, RequestMethod.POST})@ResponseBodypublic Object hualalaRegist(@Validated({HualalaRegistVO.A.class}) HualalaRegistVO registVO, BindingResult bindingResult, HttpServletRequest request) throws Exception {if(bindingResult.hasErrors())return new ResultBean<>(HttpStatus.SC_BAD_REQUEST,"请求参数错误",null);if (!"dev".equals(profile)) {registVO.setPhoneNumber(LongdaiUtil.decrypt(registVO.getPhoneNumber()));registVO.setGroupID(LongdaiUtil.decrypt(registVO.getGroupID()));}registVO.setIpAddress(NetworkUtil.getIpAddress(request));return hualalaService.hualalaRegist(registVO);}复制代码5. custom validation复制代码@Documented@Retention(RUNTIME)@Target({FIELD, ANNOTATION_TYPE, PARAMETER})@Constraint(validatedBy = AdultValidator.class)public @interface Adult {String message() default "{adult}";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };}复制代码复制代码@Componentpublic class AdultValidator implements ConstraintValidator<Adult, LocalDate> {private static final int ADULT_AGE = 18;@Overridepublic boolean isValid(LocalDate dateOfBirth, ConstraintValidatorContext constraintValidatorContext) { return dateOfBirth != null && LocalDate.now().minusYears(ADULT_AGE).isAfter(dateOfBirth);}}复制代码@NotNull@Past@Adultprivate LocalDate dateOfBirth;。
Spring的注解一、 spring注解1、@Autowired注入注解@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装工作。
@Autowired的标注位置不同,它们都会在Spring在初始化这个bean时,自动装配这个属性。
@Autowired是根据类型进行自动装配的。
例如,如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常。
如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。
我们可以使用@Qualifier配合@Autowired来解决这些问题。
1.public class TestController {2.3.@Autowired4.@Qualifier(“u serDao”)5.Private UserService userService;6.7.@RequestMapping("/showView")8.public ModelAndView showView(){9.ModelAndView modelAndView = new ModelAndView();10.modelAndView.setViewName("viewName");11.modelAndView.addObject("属性名称","属性值");12.return modelAndView;13.}14.}2、@Resource注入注解JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource 默认按byName自动注入罢了。
详解springmvc常⽤5种注解⼀、组件型注解:1、@Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。
2、@Repository 对Dao实现类进⾏注解 (特殊的@Component)3、@Service ⽤于对业务逻辑层进⾏注解, (特殊的@Component)4、@Controller ⽤于控制层注解, (特殊的@Component)以上四种注解都是注解在类上的,被注解的类将被spring初始话为⼀个bean,然后统⼀管理。
⼆、请求和参数型注解:1、@RequestMapping:⽤于处理请求地址映射,可以作⽤于类和⽅法上。
●value:定义request请求的映射地址●method:定义地request址请求的⽅式,包括【GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE.】默认接受get请求,如果请求⽅式和定义的⽅式不⼀样则请求⽆法成功。
●params:定义request请求中必须包含的参数值。
●headers:定义request请求中必须包含某些指定的请求头,如:RequestMapping(value = "/something", headers = "content-type=text/*")说明请求中必须要包含"text/html", "text/plain"这中类型的Content-type头,才是⼀个匹配的请求。
●consumes:定义请求提交内容的类型。
●produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回@RequestMapping(value="/requestTest.do",params = {"name=sdf"},headers = {"Accept-Encoding=gzip, deflate, br"},method = RequestMethod.GET) public String getIndex(){System.out.println("请求成功");return "index";}上⾯代码表⽰请求的⽅式为GET请求,请求参数必须包含name=sdf这⼀参数,然后请求头中必须有 Accept-Encoding=gzip, deflate, br这个类型头。
springmvc中@requestbody注解接收请求参数 1、@requestBody注解常⽤来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,⽐如说:application/json或者是application/xml等。
⼀般情况下来说常⽤其来处理application/json类型。
2、 通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。
例如说以下情况: $.ajax({ url:"/login", type:"POST", data:'{"userName":"admin","pwd","admin123"}', content-type:"application/json charset=utf-8", success:function(data){ alert("request success ! "); } }); @requestMapping("/login") public void login(@requestBody String userName,@requestBody String pwd){ System.out.println(userName+" :"+pwd); } 这种情况是将JSON字符串中的两个变量的值分别赋予了两个字符串,但是呢假如我有⼀个User类,拥有如下字段: String userName; String pwd; 那么上述参数可以改为以下形式:@requestBody User user 这种形式会将JSON字符串中的值赋予user中对应的属性上 需要注意的是,JSON字符串中的key必须对应user中的属性名,否则是请求不过去的。
springCache注解详解@CacheConfig:主要⽤于配置该类中会⽤到的⼀些共⽤的缓存配置。
在这⾥@CacheConfig(cacheNames = "users"):配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中,我们也可以不使⽤该注解,直接通过@Cacheable⾃⼰配置缓存集的名字来定义。
@Cacheable:配置了findByName函数的返回值将被加⼊缓存。
同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。
该注解主要有下⾯⼏个参数:@Cacheable(cacheNames="books", key="#isbn")public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="#isbn.rawNumber")public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="T(someType).hash(#isbn)")public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)@Cacheable(cacheNames="books", key="#map['bookid'].toString()")public Book findBook(Map<String, Object> map)缓存的同步 sync:在多线程环境下,某些操作可能使⽤相同参数同步调⽤。
Spring注解的参数
二、Spring2.5引入注解式处理器支持,通过@Controller和@RequestMapping注解定义我们的处理器类。
并且提供了一组强大的注解:
需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller和@RequestMapping注解的处理器。
@Controller:用于标识是处理器类;
@RequestMapping:请求到处理器功能方法的映射规则;
@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;@RequestParam是传参数的
@ModelAttribute:请求参数到命令对象的绑定;
@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session 中;
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;
三、Spring3.0引入RESTful架构风格支持(通过@PathVariable注解和一些其他特性支持),且又引入了更多的注解支持:
@CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定;
@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定;
@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler:注解式声明异常处理器;
@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,从而支持RESTful架构风格的URI;
@Resource注解被用来激活一个命名资源(named resource)的依赖注入
@Autowired这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。
ng.SuppressWarnings是J2SE5.0中标准的Annotation之一。
可以标注在类、
字段、方法、参数、构造方法,以及局部变量上。
作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。
使用:
@SuppressWarnings(“”)
@SuppressWarnings({})
@SuppressWarnings(value={})
根据sun的官方文档描述:
value-将由编译器在注释的元素中取消显示的警告集。
允许使用重复的名称。
忽略第
二个和后面出现的名称。
出现未被识别的警告名不是错误:编译器必须忽略无法识别的所有警告名。
但如果某个注释包含未被识别的警告名,那么编译器可以随意发出一个警告。
各编译器供应商应该将它们所支持的警告名连同注释类型一起记录。
鼓励各供应商之间相互合作,确保在多个编译器中使用相同的名
称。
示例:
·@SuppressWarnings("unchecked")
告诉编译器忽略unchecked警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。
·@SuppressWarnings("serial")
如果编译器出现这样的警告信息:The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long
使用这个注释将警告信息去掉。
·@SuppressWarnings("deprecation")
如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。
使用这个注释将警告信息去掉。
·@SuppressWarnings("unchecked","deprecation")告诉编译器同时忽略unchecked和deprecation的警告信息。
·@SuppressWarnings(value={"unchecked", "deprecation"})
等同于@SuppressWarnings("unchecked", "deprecation")。