如何通过java命令更改对象_java – 如何在绑定spring mvc命令对象时自定义参数名称...

这个解决方案更简洁,但需要使用RequestMappingHandlerAdapter,当< mvc:annotation-driven />启用。

希望它会帮助某人。

想法是扩展ServletRequestDataBinder像这样:

/**

* ServletRequestDataBinder which supports fields renaming using {@link ParamName}

*

* @author jkee

*/

public class ParamNameDataBinder extends ExtendedServletRequestDataBinder {

private final Map renameMapping;

public ParamNameDataBinder(Object target, String objectName, Map renameMapping) {

super(target, objectName);

this.renameMapping = renameMapping;

}

@Override

protected void addBindValues(MutablePropertyValues mpvs, ServletRequest request) {

super.addBindValues(mpvs, request);

for (Map.Entry entry : renameMapping.entrySet()) {

String from = entry.getKey();

String to = entry.getValue();

if (mpvs.contains(from)) {

mpvs.add(to, mpvs.getPropertyValue(from).getValue());

}

}

}

}

适当的处理器:

/**

* Method processor supports {@link ParamName} parameters renaming

*

* @author jkee

*/

public class RenamingProcessor extends ServletModelAttributeMethodProcessor {

@Autowired

private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

//Rename cache

private final Map, Map> replaceMap = new ConcurrentHashMap, Map>();

public RenamingProcessor(boolean annotationNotRequired) {

super(annotationNotRequired);

}

@Override

protected void bindRequestParameters(WebDataBinder binder, NativeWebRequest nativeWebRequest) {

Object target = binder.getTarget();

Class> targetClass = target.getClass();

if (!replaceMap.containsKey(targetClass)) {

Map mapping = analyzeClass(targetClass);

replaceMap.put(targetClass, mapping);

}

Map mapping = replaceMap.get(targetClass);

ParamNameDataBinder paramNameDataBinder = new ParamNameDataBinder(target, binder.getObjectName(), mapping);

requestMappingHandlerAdapter.getWebBindingInitializer().initBinder(paramNameDataBinder, nativeWebRequest);

super.bindRequestParameters(paramNameDataBinder, nativeWebRequest);

}

private static Map analyzeClass(Class> targetClass) {

Field[] fields = targetClass.getDeclaredFields();

Map renameMap = new HashMap();

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;

}

}

注解:

/**

* Overrides parameter name

* @author jkee

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface ParamName {

/**

* The name of the request parameter to bind to.

*/

String value();

}

弹簧配置:

最后,使用(如Bozho解决方案):

public class Job {

@ParamName("job-type")

private String jobType;

@ParamName("loc")

private String location;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值