Implement custom parameters parser --HandlerMethodArgumentResolver

1. Why do you need to achieve their argument parser

Inside the parameters of the place we all know add @RequestBody in interface methods such as annotated in comment, springMVC will be automatically mapped to the message body and other analytical methods requested parameter.

If the information we want is not entirely from the message body and other places, for example, is part of the message body, message header is part of, or even get a part from the configuration. This time we want to come into the reference method will be good information assembled. Or that need to be resolved when the authentication token from the message header inside.

2. HandlerMethodArgumentResolver Interface

Achieve HandlerMethodArgumentResolver expanding your argument parser. The interface has two methods supportsParameter and resolveArgument we need to override these two methods.

 

 

 

supportsParameter is a condition that only returns true when this method. Parameters will be resolved in the call resolveArgument method.

Spring source code of these two methods of call:

 

 

 

3. To achieve their argument parser:

 

package com.nijunyang.springboot.argsresolver;

import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.HttpServletRequest;

/**
 * @author: create by nijunyang
 * @date:2019/11/30
 */
public class DefArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        //方法参数是User 则使用此解析器
        return User.class.isAssignableFrom(methodParameter.getParameterType());
    }

    @Nullable
    @Override
    public Object resolveArgument(
            MethodParameter methodParameter,
            @Nullable ModelAndViewContainer modelAndViewContainer,
            NativeWebRequest nativeWebRequest,
            @Nullable WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest servletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        String info = (String) nativeWebRequest.getAttribute("params", NativeWebRequest.SCOPE_REQUEST);
        //获取消息头认证信息,没有后续操作了,根据业务实际来解析校验该token
        String token = servletRequest.getHeader("Authorization");
        //自己塞数据进去,也可以从配置文件获取数据
        return new User("zhangsan",18);


    }
}

 

4.将自己的解析器加入到容器的解析器集合中

package com.nijunyang.springboot.argsresolver;

import org.springframework.stereotype.Component;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @author: create by nijunyang
 * @date:2019/11/30
 */
@Component
//一定要将自己的扩展类加到容器中
public class DefWebMvcConfigurer implements WebMvcConfigurer {

    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new DefArgumentResolver());
    }
}

当然也可以用注解的形式注入到DefWebMvcConfigurer 中在添加到集合中,同时还可以在DefArgumentResolver 中获取配置的信息。

5.Test

package com.nijunyang.springboot.argsresolver;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: create by nijunyang
 * @date:2019/11/30
 */
@RestController
public class Controller {

    @GetMapping("/test")
    public String test(User user){
        return user.toString();
    }
}

6.效果:

 

直接可以获取到我们自定返回的对象。

 

Guess you like

Origin www.cnblogs.com/nijunyang/p/11964399.html