spring boot参数绑定以及data类型时间处理

##1 参数的绑定

1.1 请求参数的绑定

默认绑定行为根据名称匹配原则进行的数据绑定,当请求中的参数名与方法参数名一致时,相应的参数值将被绑定到对应的方法参数上。

http://localhost:8080/t1?age=18&name=wfg
  @RequestMapping("/t1")
    public String t1(int age,String name){
        return  name+"年龄为:"+age;
    }

除了可以基于注解定义多个简单参数外,我们可以指定javaBean对象的引用

public class Person {
    int age;
    String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  @RequestMapping("/t1")
    public String t1(Person person){
        return person.getName()+"年龄为:"+person.getAge();
    }

注意:所绑定的参数必须与请求参数的名称相同

1.1.1 使用@requestParam明确指定的关系

可以根据@RequestParam的信息重新考虑要将请求参数绑定到当前方法参数上

  @RequestMapping("/t1")
    //requestParam 默认情况下,所指定的请求参数不存在,绑定过程中出现异常,可以将required的属性修改为false
    public String t1(@RequestParam(value = "age" ,required = false) int update_age, String name){
        return  name+"年龄为:"+update_age;
    }

注意:默认情况下使用requestParam 所绑定的参数必须存在

requsetParam 还可以获取application/x-www-form-urlencoded的编码格式post表单提交

1.2 使用@pathvarabiles注解获取请求路径

@PathVariable注解的作用就是从URL里面读取参数值,可以在@RequestMapping里面添加占位符{paramName},还可以添加正则表达式

http://localhost:8080/t2/wfg
 @RequestMapping("/t2/{name}")
    public String t2(@PathVariable String name){
        return "name:"+name;
    }

1.3 使用@ResponseBody接受json数据格式

请求参数永远都是一个,因为一个request中只包含一个request body. 理解了这个,就会明白Spring MVC不支持多个@RequestBody。 所以我们只能用实体对象,Map或者直接用String类型去接收数据

否则SpringMVC会直接把整个json字符串注入到参数中,此时用String类型的参数是可以接收的,但是用Integer,Long等其他类型会报JSON转换异常。

Cannot deserialize value of type `java.lang.Integer` from Object value (token `JsonToken.START_OBJECT`)
{
    "age": 18,
    "name": "wfg"
}
@RequestMapping("/t3")
    public Person t3(@RequestBody Person person){
        return  person;
    }

前端发送给后台的数据只是一个对象(使用场景:如注册,保存空户,修改信息),那么我们就大课放心的使用application/json来处理数据 可以使用HandlerMethodArgumentResolver进行自定义参数解析器。

1.4 使用@RequestHeader获取请求头信息

   @RequestMapping("/t5")
    public String t5(@RequestHeader("Connection") String param1){
        return  param1;
    }

2 时间类型参数处理

当前台传递的是字符串日期类型与后台的日期类型不能匹配,我们就需要对该类型进行转换为日期类型,@DateTimeFormat是用于处理前台转到后台时类型匹配问题。,@JsonFormat是处理后台转到前台为时间戳问题

2.1 处理方法

@DateTimeFormat是格式化 key=value 这种格式,只能用于@RequestParam

    /*
     * @Description:  将前台所传的 yyyy-MM-dd HH:mm:ss字符串格式给解析为date类型
     * @param [beginTime]
     * @return java.lang.String
     */
    @RequestMapping("/t7")
    public String t7(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date beginTime){

         return  beginTime.toString();
    }

注意:pattern所解析的格式一定要和前台所传的数据一致

2.2 @DateTimeFormat无效

@DateTimeFormat放到@RequestBody下是无效的,我们可以使用**@JsonFormat**进行处理

@Data
public class TestDate {
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    Date beginTime;
}
    @RequestMapping("/t8")
    public String t8(@RequestBody TestDate testDate){
      
        return  testDate.getBeginTime().toString();
    }

在@RequestBody中则可以使用**@JsonFormat把传给后台的时间字符串转成Date,也就是说@JsonFormat其实既可以把传给后台的时间字符串转成Date也可以把后台传出的Date转成时间字符串。**

2.3 自定义数据绑定解决date参数问题

我们想要对所是使用的databinder,做进一步的定制,通常的写法是复写父类的initBinder方法,在注解的实现里我们可以是用@initbinder注解实现

public class BaseController {
    @InitBinder
   public void initBinder(WebDataBinder binder){
      // 自定义属性编辑器,通过重写PropertyEditorSupport里面的setAsText最后调用setValue方法,完成转换后值的设置
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
        {
            @Override
            public void setAsText(String text)
            {
                         //通过工具类进行转换为相应的date
                    setValue(DateUtils.parseDate(text));
            }
        });
    }
}

end
  • 作者:王富贵(联系作者)
  • 发表时间:2021-08-19 12:17
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 评论