カスタムパラメータを実装するパーサ--HandlerMethodArgumentResolver

1.なぜあなたは自分の引数パーサを達成する必要があります

場所のパラメータ内では、コメントで注釈付きのようなインターフェイスのメソッド内のすべての既知の追加@RequestBodyは、springMVCは、自動的にメッセージ本体や他の分析方法要求されたパラメータにマップされます。

私たちが望む情報がメッセージ本文やその他の場所から完全にない場合には、例えば、メッセージ本文の一部であり、メッセージヘッダはの一部である、あるいは設定から​​一部を取得します。我々は参照方法に来てほしい今回は良い情報がアセンブルされます。または認証はメッセージヘッダ内からトークンときに解決することが必要。

2. HandlerMethodArgumentResolverインタフェース

あなたの引数パーサを拡大HandlerMethodArgumentResolver達成。インターフェイスは、我々はこれらの2つのメソッドをオーバーライドする必要がsupportsParameterとresolveArgument二つの方法があります。

 

 

 

supportsParameterは、この方法のみtrueを返すという条件です。パラメータは、コールresolveArgument方法で解決されます。

コールのこれらの2つの方法の春のソースコード:

 

 

 

3.自分の引数パーサを達成するために:

 

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.效果:

 

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

 

おすすめ

転載: www.cnblogs.com/nijunyang/p/11964399.html