java 自定义注解 解析器_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 addUser(Integer userid, @JsonParam("dept") Dept userDept) {

Map 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 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内容

二、注解方式配置

spring-mvc.xml内容

自定义注解类内容

@Configuration

@EnableWebMvc

public class MyConfiguration extends WebMvcConfigurerAdapter {

@Override

public void addArgumentResolvers(List argumentResolvers) {

argumentResolvers.add(new JsonParamProvider());

}

}

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

自定义注解类内容

@Configuration

public class MyConfiguration extends WebMvcConfigurationSupport {

@Override

public void addArgumentResolvers(List argumentResolvers) {

argumentResolvers.add(new JsonParamProvider());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值