SpringMVC底层分析--3.参数解析器和返回值解析器

一.参数解析器

参数解析器HandlerMethodArgumentResovler,可以对参数进行解析,例如@RequestParam,@Header等,下面我们来自定义实现一个@Token解析器,用于接受请求头中携带的token信息

二.自定义Token解析器

1.定义@Token

//在方法参数上使用
@Target(ElementType.PARAMETER)
//在运行时使用
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {
}

2.自定义token解析器

public class TokenResovler implements HandlerMethodArgumentResolver {
    /**
     * 判断是否存在注解
     * @param parameter
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        Token token = parameter.getParameterAnnotation(Token.class);
        return token != null;
    }

    //返回获取到的参数值
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

       //从头信息中获取
        return webRequest.getHeader("token");
    }
}

3.将token解析器添加到适配器中

    //自定义RequestMappingHandlerAdapter
    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter(){
        MyRequestMappingHandlerAdapter adapter = new MyRequestMappingHandlerAdapter();
        //添加token参数解析器
        ArrayList<HandlerMethodArgumentResolver> list = new ArrayList<>();
        list.add(new TokenResovler());
        adapter.setCustomArgumentResolvers(list);
        return adapter;
    }

4.写好controller方法 

    @PostMapping("/test4")
    public String test4(@Token String token){
        log.info("token:"+token);
        return "test4";
    }

5.模拟请求调用

  MockHttpServletRequest request = new MockHttpServletRequest("POST", "/test4");
        request.addHeader("token","张三");
        HttpServletResponse response = new MockHttpServletResponse();

        HandlerExecutionChain chain = handlerMapping
                .getHandler(request);

        MyRequestMappingHandlerAdapter handlerAdapter =  context
                .getBean(MyRequestMappingHandlerAdapter.class);

        //调用该方法
        handlerAdapter.invokeHandlerMethod(request,response, (HandlerMethod) chain.getHandler());

6.运行

11:10:34.872 [main] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped to com.jjh.config.MyController#test4(String)
11:10:34.884 [main] INFO com.jjh.config.MyController - token:张三

可以看到已经成功通过我们自定义的token头信息解析器获取到头信息的值了!

三.自定义yaml返回值解析器

1.自定义@Yml

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Yml {
}

2.自定义yml返回值解析器

public class YmlReturnValueHandler implements HandlerMethodReturnValueHandler {
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        Yml yml = returnType.getMethodAnnotation(Yml.class);
        return yml !=null;

    }

    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
       //将结果对象转化为yaml字符串
        String yaml = new Yaml().dump(returnValue);

        //将yaml字符串写入响应对象
        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
        assert response != null;
        response.setContentType("text/plain;charset=utf-8");
        response.getWriter().print(yaml);

         //设置请求处理完成
        mavContainer.setRequestHandled(true);

    }
}

3.将yml返回值解析器添加到适配器中

 @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter(){
        MyRequestMappingHandlerAdapter adapter = new MyRequestMappingHandlerAdapter();
        //添加token参数解析器
        ArrayList<HandlerMethodArgumentResolver> list = new ArrayList<>();
        list.add(new TokenResovler());
        adapter.setCustomArgumentResolvers(list);
        //添加yaml结果解析器
        ArrayList<HandlerMethodReturnValueHandler> returnlist = new ArrayList<>();
        returnlist.add(new YmlReturnValueHandler());
        adapter.setCustomReturnValueHandlers(returnlist);

        return adapter;
    }

4.写好controller方法

  @RequestMapping("/test5")
    @Yml
    public User test5(){
        log.info("test5...");
        return new User("jjh123","123456");
    }

5.模拟请求调用

 MockHttpServletRequest request = new MockHttpServletRequest("GET","/test5");
        MockHttpServletResponse response = new MockHttpServletResponse();
        HandlerExecutionChain chain = handlerMapping.getHandler(request);

        MyRequestMappingHandlerAdapter handlerAdapter =
                context.getBean(MyRequestMappingHandlerAdapter.class);

        assert chain != null;
        handlerAdapter.invokeHandlerMethod(request,response, (HandlerMethod) chain.getHandler());

        //检查响应
        byte[] content = response.getContentAsByteArray();

        java.lang.String str = StringUtils.defaultToString(content);
        System.out.println(str);

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 提供了多种参数解析器来处理客户端请求中的参数,并将其绑定到方法参数上。以下是一些常用的参数解析器: 1. `@RequestParam`:用于将请求中的参数绑定到方法参数上。可以指定参数名、是否必需、默认值等属性。例如: ```java @RequestMapping("/example") public String example(@RequestParam("name") String name) { // 处理请求参数 return "result"; } ``` 2. `@PathVariable`:用于将 URL 中的路径变量绑定到方法参数上。例如: ```java @RequestMapping("/example/{id}") public String example(@PathVariable("id") int id) { // 处理路径变量 return "result"; } ``` 3. `@RequestBody`:用于将请求体中的数据绑定到方法参数上。常用于处理 JSON 或 XML 格式的请求数据。例如: ```java @RequestMapping("/example") public String example(@RequestBody User user) { // 处理请求体数据 return "result"; } ``` 4. `@ModelAttribute`:用于将请求参数绑定到自定义对象上,并添加到模型中,以便在视图中使用。例如: ```java @RequestMapping("/example") public String example(@ModelAttribute("user") User user) { // 处理请求参数并添加到模型 return "result"; } ``` 5. 其他参数解析器:还有一些其他的参数解析器,如 `@RequestHeader`(获取请求头信息)、`@CookieValue`(获取 Cookie 值)等,可以根据具体需求选择使用。 以上是一些常用的参数解析器Spring MVC 还提供了更多的参数解析器和灵活的配置选项,以满足各种需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值