资讯专栏INFORMATION COLUMN

3.6、@RequestParam 和 @RequestBody

iKcamp / 2843人阅读

摘要:负责把请求消息转换为一个对象,也把一个对象转换为请求体。也要注意,如果使用命名空间或者配置,一个更大范围的消息转换器被默认注册。如果没有声明这样的参数,一个异常将会抛出。这个异常会在中处理,并返回一个错误到客户端。

  这一部分实例见项目的 mvc 分支下的 ParamAndBodyController.java

① 使用@RequestParam绑定请求参数到方法参数

  使用@RequestParam注解绑定请求参数到你的控制器方法中的参数。下面的代码段展示了这种用法:

    /**
     * 使用 @RequestParam 时,请求参数名要和 @RequestParam 的值一样,而不是和方法参数名一样
     */
    @GetMapping("/find/pet")
    public String findPet(@RequestParam("petId") int pid, ModelMap model) 
    {

        System.out.println("--> petId : " + pid);
        
        /**
         * 将被放到响应中,发送到客户端
         */
        model.addAttribute("test", "Hello World");
        
        return "/examples/targets/test4";
    }

  默认情况下,使用这个注解的参数是必须的,但是你可以通过设置@RequestParamrequired属性为false来指定参数是可选的(如: @RequestParam(path="id", required=false))。

  如果目标方法的类型参数不是String类型的,将自动应用类型转换。见 “方法参数和类型转换”一节.

  当一个@RequestParam注解用在一个Map或者MultiValueMap类型的参数上是,这个map将包含所有请求参数

② 使用@RequestBody注解映射请求体

  方法参数注解@RequestBody指定一个方法参数应该被绑定到 HTTP 请求体的值。例如:

    /**
     * 带有 @RequestBody 注解的参数,直接可以得到请求体
     */
    @PutMapping("/handle")
    public void handle(@RequestBody String body, Writer writer) throws IOException 
    {
        System.out.println("--> body : " + body);
        
        /**
         * 将被放到响应中,发送到客户端
         */
        writer.write("{ pet :" + body + " }");
    }

  通过使用一个HttpMessageConverter,你能够把请求体转换为方法参数。HttpMessageConverter负责把 HTTP 请求消息转换为一个对象,也把一个对象转换为 HTTP 请求体。RequestMappingHandlerAdapter支持@RequestBody注解使用下面的默认的HttpMessageConverters:

ByteArrayHttpMessageConverter转换字节数组

StringHttpMessageConverter转换字符串

FormHttpMessageConverter在表单数据和MultiValueMap对象之间转换.

SourceHttpMessageConverter在请求体和javax.xml.transform.Source之间转换.

  更多关于这些转换器的信息,见消息转换器。也要注意,如果使用MVC命名空间或者MVCJava配置,一个更大范围的消息转换器被默认注册。更多信息见18.16.1节“使用MVC Java配置或者MVC XML命名空间”。

  如果你打算读写XML,你会需要配置一个带有指定Marshaller和Unmarshaller(在包org.springframework.oxm中)实现的MarshallingHttpMessageConverter。虽然下面的例子展示了怎让直接在你的配置中做,但是如果你的应用程序通过 MVC 命名空间或者 MVC Java 配置,你要参考18.16.1节“使用 MVC Java 配置或者 MVC XML 命名空间”。


    
        
            
            
        
    





    
    



  一个@RequestBody方法参数可以带有注解@Valid,此时它会被配置好的Validator实例校验。当使用 MVC 命名空间或者 MVC Java 配置时,一个 JSR-303 校验器会自动配置进来,如果类路径中有一个可用的 JSR-303 实现的话。

  就像@ModelAttribute参数一样,一个 Errors 参数可以用于检查错误。如果没有声明这样的参数,一个 MethodArgumentNotValidException 异常将会抛出。这个异常会在 DefaultHandlerExceptionResolver 中处理,并返回一个400错误到客户端。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65158.html

相关文章

  • spring-mvc注解

    摘要:关键注解的关键注解主要有其中主要是用于标记该类是一个控制器,用于指示的哪一个类或方法来处理请求动作,即用于标识具体的处理器。默认已经装配了作为组件的实现类,而由使用,将请求信息转换为对象。 关键注解 springmvc的关键注解主要有@Controller/@RequestMapping/@RequestParam/@PathVariable/@RequestHeader/@Cooki...

    EdwardUp 评论0 收藏0
  • spring-boot上传

    摘要:的文档上说解决了对文件上传的支持问题之前需要借助完成的事现在不需要依赖它了也就是说在中不能用实现接口了下面这样定义是错误的我们所要做的就是什么也不做默认就不用了下面说说具体实现文件单独上传这个只需要用就可以了文件上传表单上传上传 spring-boot的文档上说 Spring Boot embraces the Servlet 3 javax.servlet.http.Part API...

    fnngj 评论0 收藏0
  • SpringMVC入门笔记

    摘要:简介注解用于修饰的方法,根据的的内容,通过适当的转换为客户端需要格式的数据并且写入到的数据区,从而不通过视图解析器直接将数据响应给客户端。并且这些解析器都实现了接口,在接口中有四个最为主要的接口方法。 SpringMVC 细节方面的东西很多,所以在这里做一篇简单的 SpringMVC 的笔记记录,方便以后查看。 Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本...

    gekylin 评论0 收藏0
  • springcloud 基于feign的服务接口的统一hystrix降级处理

    摘要:开发微服务时,基于来做声明式服务接口,当启用服务熔断降级时,项目服务众多,每个服务接口都得写一些重复问的服务降级处理代码,势必显得枯燥无味服务接口创建商品修改商品删除商品根据获取商品信息根据条件查询商品列表分页排序对应的熔断降级处理类请 springcloud开发微服务时,基于feign来做声明式服务接口,当启用hystrix服务熔断降级时,项目服务众多,每个Feign服务接口都得写一...

    hersion 评论0 收藏0
  • spring参数传递检验

    摘要:背景在请求时,要对参数进行检查,以前一直使用如下方式来获取参数,在参数特别多的时候,代码很不简洁。使用注解来对参数进行校验能让代码更整洁。 1.背景 在spring请求时,要对参数进行检查,以前一直使用如下方式来获取参数,在参数特别多的时候,代码很不简洁。 String userId= request.getParameter(userId); 后来使用注解@RequestParam代...

    iflove 评论0 收藏0

发表评论

0条评论

iKcamp

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<