spring mvc给参数起别名
需求:
将http报文请求(保护body和url)中的参数传递给Controller时支持使用别名。
举例:
下面两条请求报文的结果是一致的。
http://example.com/foo?jobType=permanent&location=Stockholm
http://example.com/foo?jt=permanent&loc=Stockholm
返回响应
解决方法
Spring MVC3 提供了丰富的参数映射机制, 详细信息可以参见这里
同时对于Spring MVC默认的提供的映射机制不能涵盖的对象,我们可以通过扩展HandlerMethodArgumentResolver和HttpMessageConverter的机制来实现。
HandlerMethodArgumentResolver对应输入, HttpMessageConverter对应输出
1.预备代码
package com.davidwang456.web.model;import com.davidwang456.web.annotation.ParamName;public class Job {@ParamName("jt")private String jobType;@ParamName("loc")private String location;public String getJobType() {return jobType;}public void setJobType(String jobType) {this.jobType = jobType;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}@Overridepublic String toString(){return "jobType="+jobType+",location="+location;}}
2.注解
package com.davidwang456.web.annotation;import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import java.lang.annotation.ElementType; import java.lang.annotation.RetentionPolicy; /*** Overrides parameter name*/@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ParamName {/*** The name of the request parameter to bind to.*/String value();}
3.注解处理器
package com.davidwang456.web.processor;import java.lang.reflect.Field; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor;import com.davidwang456.web.annotation.ParamName;/*** Method processor supports {@link ParamName} parameters renaming**/public class RenamingProcessor extends ServletModelAttributeMethodProcessor {@Autowiredprivate RequestMappingHandlerAdapter requestMappingHandlerAdapter;//Rename cacheprivate final Map<Class<?>, Map<String, String>> replaceMap = new ConcurrentHashMap<Class<?>, Map<String, String>>();public RenamingProcessor(boolean annotationNotRequired) {super(annotationNotRequired);}@Overrideprotected void bindRequestParameters(WebDataBinder binder, NativeWebRequest nativeWebRequest) {Object target = binder.getTarget();Class<?> targetClass = target.getClass();if (!replaceMap.containsKey(targetClass)) {Map<String, String> mapping = analyzeClass(targetClass);replaceMap.put(targetClass, mapping);}Map<String, String> mapping = replaceMap.get(targetClass);ParamNameDataBinder paramNameDataBinder = new ParamNameDataBinder(target, binder.getObjectName(), mapping);requestMappingHandlerAdapter.getWebBindingInitializer().initBinder(paramNameDataBinder, nativeWebRequest);super.bindRequestParameters(paramNameDataBinder, nativeWebRequest);}private static Map<String, String> analyzeClass(Class<?> targetClass) {Field[] fields = targetClass.getDeclaredFields();Map<String, String> renameMap = new HashMap<String, String>();for (Field field : fields) {ParamName paramNameAnnotation = field.getAnnotation(ParamName.class);if (paramNameAnnotation != null && !paramNameAnnotation.value().isEmpty()) {renameMap.put(paramNameAnnotation.value(), field.getName());}}if (renameMap.isEmpty()) return Collections.emptyMap();return renameMap;} }
4.数据绑定
package com.davidwang456.web.processor;import java.util.Map;import javax.servlet.ServletRequest;import org.springframework.beans.MutablePropertyValues; import org.springframework.web.servlet.mvc.method.annotation.ExtendedServletRequestDataBinder;/** * ServletRequestDataBinder which supports fields renaming using {@link ParamName} * */ public class ParamNameDataBinder extends ExtendedServletRequestDataBinder {private final Map<String, String> renameMapping;public ParamNameDataBinder(Object target, String objectName, Map<String, String> renameMapping) {super(target, objectName);this.renameMapping = renameMapping;}@Overrideprotected void addBindValues(MutablePropertyValues mpvs, ServletRequest request) {super.addBindValues(mpvs, request);for (Map.Entry<String, String> entry : renameMapping.entrySet()) {String from = entry.getKey();String to = entry.getValue();if (mpvs.contains(from)) {mpvs.add(to, mpvs.getPropertyValue(from).getValue());}}} }
5.注册处理器
<mvc:annotation-driven><mvc:argument-resolvers><bean class="com.davidwang456.web.processor.RenamingProcessor"><constructor-arg name="annotationNotRequired" value="true"/></bean></mvc:argument-resolvers></mvc:annotation-driven>
或者java config模式
package com.davidwang456.web.configurer;import java.util.List;import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import com.davidwang456.web.processor.RenamingProcessor;@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter{@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {RenamingProcessor renameResolver = new RenamingProcessor(true);argumentResolvers.add(renameResolver);} }
参考文献:
【1】http://stackoverflow.com/questions/8986593/how-to-customize-parameter-names-when-binding-spring-mvc-command-objects
【2】http://geekabyte.blogspot.tw/2014/08/how-to-inject-objects-into-spring-mvc.html
【3】http://www.cnblogs.com/daxin/p/3296493.html
转载于:https://www.cnblogs.com/davidwang456/p/6781731.html
spring mvc给参数起别名相关推荐
- 详解Spring MVC请求参数类型,解决中文乱码问题,自定义类型转换器,Spring MVC相关注解
#SpringMVC SpringMVC请求 简单类型 简单类型包括:基本类型,基本类型的包装类型,字符串 编写Controller @RequestMapping("/param" ...
- Spring MVC初始化参数绑定
初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法 使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型 proper ...
- Spring MVC获取参数的几种常见方式
Controller 接收请求参数的方式有很多种,有的适合 get 请求方式,有的适合 post 请求方式,有的两者都适合.下面分别介绍这些方式,读者可以根据实际情况选择合适的接收方式. 通过实体 B ...
- Spring MVC在参数绑定前通过Filter过滤器改变请求参数的值
第一步,对request请求进行增强: /*** author: zhangxueliang* date: 2019-08-23*/ public class ParameterServletRequ ...
- spring MVC使用自定义的参数解析器解析参数
目录 写在前面 编写自定义的参数解析器解析请求参数 项目结构 定义注解 实体类 controller 定义参数解析器 注册参数解析器 启动项目 发起请求查看结果 写在前面 如果还有小伙伴不知道spri ...
- Spring MVC自定义类型转换器Converter、参数解析器HandlerMethodArgumentResolver
文章目录 一.前言 二.类型转换器Converter 1.自定义类型转换器 三.参数解析器 1.自定义分页参数解析器 2.自定义注解参数解析器 一.前言 Spring MVC源码分析相关文章已出: S ...
- 通用后台管理系统(ExtJS 4.2 + Spring MVC 3.2 + Hibernate)
通用后台管理系统(ExtJS 4.2 +Spring MVC 3.2 + Hibernate) 开发语言JAVA 成品成品 前端技术extjs 数据库mysql,sql server,oracle 系 ...
- Spring MVC应用@Autowired和@Service进行依赖注入
在前面学习的控制器中并没有体现 MVC 的 M 层,这是因为控制器既充当 C 层又充当 M 层.这样设计程序的系统结构很不合理,应该将 M 层从控制器中分离出来. Spring MVC 框架本身就是一 ...
- java接口参数类型为枚举_Spring MVC处理参数中的枚举类型通用实现方法
前言 在开发的过程中,会涉及到大量的枚举类型数据,我们都知道,Springmvc本身能自动转换很多的数据类型,也支持你自定义转换类型,非常灵活. 本文主要介绍的是关于Spring MVC处理参数的枚举 ...
最新文章
- java 中文符号占位_java – ‘占位符’字符以避免积极比较?
- Mysql分析-profile详解
- JavaScript开发区块链只需200行代码
- 【Python小游戏】当当当当 万众瞩目得《滑雪大冒险》来啦~(附源码)
- 12-CoreData操作大量数据时的注意细节
- python图像增强_Python图像的增强处理操作示例【基于ImageEnhance类】
- Eigen入门之密集矩阵 4 - 块操作
- 前端学习(169):无语义元素
- appium+java(五)微信小程序自动化测试实践
- Hibernate一对一映射示例注释
- sql server 中某个字段值合并【转】
- 如何监测土壤pH值和水分含量
- 摄影小白入门相机选择(个人出发)
- Word Embedding与Word2Vec
- IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.
- sql 根据出生日期计算年龄
- Windows NDK安装及开发
- 中值定理证明题解题思路
- android12.0(S) Launcher3 导入 AndroidStudio 调试编译
- 【观察】重塑协同研发新模式,橙色云的沉淀与释放
热门文章
- kafka 同步提交 异步_腾讯游戏工程师分享:简单理解 Kafka 的消息可靠性策略
- mysql 实现ztree_简单Ztree的实现————不连接数据库版
- jdbc如果不关闭连接_JDBC基础整理
- 笔记本电脑性价比排行2019_办公笔记本电脑排名2019 五款适合办公的笔记本电脑推荐...
- 计算机应用基础操作题教学考试,电大教学全国计算机应用基础考试网考内容全部操作题.doc...
- java字符常量括_Java常量 变量 数据类型
- php mysql update 返回_php mysql_query增删改查(update delete insert)返回值类型
- java程序员闯关题网站_Java程序员每周必逛的十大学习网站
- java 查找 替换_java 查找、替换
- java for循环优化_Java for循环优化