需求:

将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给参数起别名相关推荐

  1. 详解Spring MVC请求参数类型,解决中文乱码问题,自定义类型转换器,Spring MVC相关注解

    #SpringMVC SpringMVC请求 简单类型 简单类型包括:基本类型,基本类型的包装类型,字符串 编写Controller @RequestMapping("/param" ...

  2. Spring MVC初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  3. Spring MVC获取参数的几种常见方式

    Controller 接收请求参数的方式有很多种,有的适合 get 请求方式,有的适合 post 请求方式,有的两者都适合.下面分别介绍这些方式,读者可以根据实际情况选择合适的接收方式. 通过实体 B ...

  4. Spring MVC在参数绑定前通过Filter过滤器改变请求参数的值

    第一步,对request请求进行增强: /*** author: zhangxueliang* date: 2019-08-23*/ public class ParameterServletRequ ...

  5. spring MVC使用自定义的参数解析器解析参数

    目录 写在前面 编写自定义的参数解析器解析请求参数 项目结构 定义注解 实体类 controller 定义参数解析器 注册参数解析器 启动项目 发起请求查看结果 写在前面 如果还有小伙伴不知道spri ...

  6. Spring MVC自定义类型转换器Converter、参数解析器HandlerMethodArgumentResolver

    文章目录 一.前言 二.类型转换器Converter 1.自定义类型转换器 三.参数解析器 1.自定义分页参数解析器 2.自定义注解参数解析器 一.前言 Spring MVC源码分析相关文章已出: S ...

  7. 通用后台管理系统(ExtJS 4.2 + Spring MVC 3.2 + Hibernate)

    通用后台管理系统(ExtJS 4.2 +Spring MVC 3.2 + Hibernate) 开发语言JAVA 成品成品 前端技术extjs 数据库mysql,sql server,oracle 系 ...

  8. Spring MVC应用@Autowired和@Service进行依赖注入

    在前面学习的控制器中并没有体现 MVC 的 M 层,这是因为控制器既充当 C 层又充当 M 层.这样设计程序的系统结构很不合理,应该将 M 层从控制器中分离出来. Spring MVC 框架本身就是一 ...

  9. java接口参数类型为枚举_Spring MVC处理参数中的枚举类型通用实现方法

    前言 在开发的过程中,会涉及到大量的枚举类型数据,我们都知道,Springmvc本身能自动转换很多的数据类型,也支持你自定义转换类型,非常灵活. 本文主要介绍的是关于Spring MVC处理参数的枚举 ...

最新文章

  1. java 中文符号占位_java – ‘占位符’字符以避免积极比较?
  2. Mysql分析-profile详解
  3. JavaScript开发区块链只需200行代码
  4. 【Python小游戏】当当当当 万众瞩目得《滑雪大冒险》来啦~(附源码)
  5. 12-CoreData操作大量数据时的注意细节
  6. python图像增强_Python图像的增强处理操作示例【基于ImageEnhance类】
  7. Eigen入门之密集矩阵 4 - 块操作
  8. 前端学习(169):无语义元素
  9. appium+java(五)微信小程序自动化测试实践
  10. Hibernate一对一映射示例注释
  11. sql server 中某个字段值合并【转】
  12. 如何监测土壤pH值和水分含量
  13. 摄影小白入门相机选择(个人出发)
  14. Word Embedding与Word2Vec
  15. IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.
  16. sql 根据出生日期计算年龄
  17. Windows NDK安装及开发
  18. 中值定理证明题解题思路
  19. android12.0(S) Launcher3 导入 AndroidStudio 调试编译
  20. 【观察】重塑协同研发新模式,橙色云的沉淀与释放

热门文章

  1. kafka 同步提交 异步_腾讯游戏工程师分享:简单理解 Kafka 的消息可靠性策略
  2. mysql 实现ztree_简单Ztree的实现————不连接数据库版
  3. jdbc如果不关闭连接_JDBC基础整理
  4. 笔记本电脑性价比排行2019_办公笔记本电脑排名2019 五款适合办公的笔记本电脑推荐...
  5. 计算机应用基础操作题教学考试,电大教学全国计算机应用基础考试网考内容全部操作题.doc...
  6. java字符常量括_Java常量 变量 数据类型
  7. php mysql update 返回_php mysql_query增删改查(update delete insert)返回值类型
  8. java程序员闯关题网站_Java程序员每周必逛的十大学习网站
  9. java 查找 替换_java 查找、替换
  10. java for循环优化_Java for循环优化