SpringMVC自定义基于注解的参数解析器


SpringMVC自定义基于注解的参数解析器

例如:
支持请求:/user/add?userid=100&dept={"id":1,"name":"部门1"}
自动将json格式值转换为JavaBean对象

前期准备

JavaBean

public class Dept {
    private Integer id;
    private String name;
}

自定义注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface JsonParam {
    String value();
}

Controller

@Controller
public class UserController {
    @RequestMapping("/users/add")
    @ResponseBody
    public Map<String, Object> addUser(Integer userid, @JsonParam("dept") Dept userDept) {
        Map<String, Object> data = new HashMap<>(2);
        data.put("userId", userid);
        data.put("userDept", userDept);
        return data;
    }
}

自定义参数解析器

public class JsonParamProvider implements HandlerMethodArgumentResolver {
    /**
     * 判断是否是需要我们解析的参数类型
     */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(JsonParam.class);
    }

    /**
     * 真正解析的方法
     */
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        Map<String, String[]> parameterMap = request.getParameterMap();

        JsonParam jsonParam = methodParameter.getParameterAnnotation(JsonParam.class);
        String paramName = jsonParam.value();
        //注解没有给定参数名字,默认取参数类型的小写
        if (StringUtils.isEmpty(paramName)) {
            String parmTypeName = methodParameter.getParameterType().getSimpleName();
            paramName = parmTypeName.substring(0, 1).toLowerCase() + parmTypeName.substring(1);
        }

        //从request中能拿到参数值
        if (parameterMap.containsKey(paramName)) {
            String paramVal = parameterMap.get(paramName)[0];
            //解析json
            ObjectMapper objectMapper = new ObjectMapper();
            Dept dept = objectMapper.readValue(paramVal.getBytes("UTF-8"), Dept.class);
            return dept;
        } else {
            return new Dept();
        }
    }
}

配置自定义参数解析器

一、xml方式配置

spring-mvc.xml内容

<?xml version="1.0" encoding="UTF-8"?>

	<context:component-scan base-package="com.demo" />
	
	<mvc:annotation-driven>
		<mvc:argument-resolvers>
			<bean class="com.demo.JsonParamProvider"/>
		</mvc:argument-resolvers>
	</mvc:annotation-driven>
</beans>  

二、注解方式配置

spring-mvc.xml内容

<?xml version="1.0" encoding="UTF-8"?>

	<context:component-scan base-package="com.demo" />
	
	<!--不能添加该标签,否则注解类不生效-->
	<!--<mvc:annotation-driven/>-->
</beans>  

自定义注解类内容

@Configuration
@EnableWebMvc
public class MyConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new JsonParamProvider());
    }
}

SpringBoot自定义基于注解的参数解析器

自定义注解类内容

@Configuration
public class MyConfiguration extends WebMvcConfigurationSupport {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new JsonParamProvider());
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM