一、创建自定义注解
package com.yxh.demo.demo.service;
import java.lang.annotation.*;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestUser {
}
二、创建自定义注解绑定对象接收参数
package com.yxh.demo.demo.model;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private Long id;
private String name;
private String no;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", no='" + no + '\'' +
'}';
}
}
三、创建自定义参数解析器
package com.yxh.demo.demo.service.serviceImpl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yxh.demo.demo.model.User;
import com.yxh.demo.demo.service.RequestUser;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
public class RequestUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//绑定注解标签
return methodParameter.hasParameterAnnotation(RequestUser.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
//获取用户ID
Object object = nativeWebRequest.getAttribute("token", RequestAttributes.SCOPE_REQUEST);
if (object == null) {
System.out.println("token为空");
}else{
System.out.println("token================"+object);
JSONObject json=new JSONObject();
json.put("id",201904081723L);
json.put("name","张三丰");
json.put("no","23563552255225");
object=json;
}
//获取用户信息
User userInfoDto = JSON.parseObject(object.toString(), User.class);
return userInfoDto;
}
}
四、添加自定义参数解析器
package com.yxh.demo.demo.configuration;
import com.yxh.demo.demo.inter.ReqInterceptor;
import com.yxh.demo.demo.service.serviceImpl.RequestUserHandlerMethodArgumentResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new RequestUserHandlerMethodArgumentResolver());
}
}
五、使用实例
package com.yxh.demo.demo.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yxh.demo.demo.model.RequestModel;
import com.yxh.demo.demo.model.User;
import com.yxh.demo.demo.service.AsyncService;
import com.yxh.demo.demo.service.RequestUser;
import com.yxh.demo.demo.util.ValidatorUtil;
import com.yxh.demo.demo.util.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
@RestController
public class TestController {
@Autowired
private AsyncService asyncService;
@RequestMapping(value = "/test")
public String test(@RequestUser User user){
System.out.println("接受参数:"+user);
return “success”;
}
这样就能用User接受自定义解析的参数