使用HandlerMethodArgumentResolver在 Controller 方法参数中 自动注入自定义对象

需求:

  • 希望 直接在 Controller 方法参数中 自动注入自定义对象,而不影响请求的 URL 或 Body。

  • 适用于 所有 @RequestMapping 方法,且不需要手动修改请求。

 

解决方法:

  使用 HandlerMethodArgumentResolver

 

1. 创建自定义对象

假设你要自动注入 Use他Info

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {

    private String requestId;

    private String userName;

    private String userId;

    private String ipAddress;
}

 

2. 创建 HandlerMethodArgumentResolver

编写 UserInfoResolver,解析 每个请求 并创建 UserInfo

@Component
public class UserInfoResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 只解析 `UserInfo` 类型的参数
        return parameter.getParameterType().equals(UserInfo.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter,
                                  ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest,
                                  WebDataBinderFactory binderFactory) throws Exception {
        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
        return new UserInfo(
                UUID.randomUUID().toString(),
                request.getHeader("X-User-Name"),
                request.getHeader("X-User-Id"),
                request.getRemoteAddr()
        );
    }
}

 

3. 在 WebMvcConfigurer 里注册解析器

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private UserInfoResolver userInfoResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(userInfoResolver);
    }
}

 

4. 在 Controller 里直接使用

你现在可以 Controller 方法参数 里直接注入 UserInfo

    @PostMapping("/verifyResolver")
    public void verifyResolver(UserInfo userInfo, @RequestBody VerifyVO vo) {
        log.info("verifyResolver: {}, {}", vo, userInfo);
    }

 

 

posted @ 2025-04-03 17:13  r1-12king  阅读(20)  评论(0)    收藏  举报