Spring MVC数据绑定的扩展 (二)

2014-11-24 02:38:39 · 作者: · 浏览: 1
Name = methodParam.getParameterName();

return inVl.getValueAsObject(paraName);

}


protected Object resolveRequestParamExt(String miType,PlatformRequest platformRequest, String paramName,

String defaultValue,MethodParameter methodParam,NativeWebRequest webRequest, Object handler)throws Exception{

if(StringUtils.isBlank(paramName)){

paramName = defaultValue;

}

Class< > paramType = methodParam.getParameterType();

DatasetList inDl = platformRequest.getDatasetList();

VariableList inVl = platformRequest.getVariableList();

if(RequestParamExt.TYPE_DS.equals(miType)){//绑定的关键过程

Dataset ds = inDl.getDataset(paramName);

Object vo = paramType.newInstance();

MiPDataBinder dataBinder = new MiPDataBinder(vo, false);

dataBinder.bind(inVl);

return dataBinder.getTarget();

}

}

同时还需要一个annotation的定义:示例如下:

package com.company.springext.web.bind.annotation;


import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;


@Target(ElementType.PARAMETER)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface RequestParamExt {

public static final String TYPE_NONE = "none";

public static final String TYPE_DS = "ds";

public static final String TYPE_VL = "vl";

public static final String TYPE_STR = "string";

String type() default TYPE_NONE;

String value() default "";

String defaultValue() default "ds";

}

最后是修改Spring配置:

vc.annotation.AnnotationMethodHandlerAdapterExt">


到此就实现了自定义格式的数据绑定。


对于特定格式的输出,如果需要自定义的话,同样需要修改AnnotationMethodHandlerAdapterExt.java这个类,关键位置在getModelAndView()方法。在如下位置:

} else if (AnnotationUtils.findAnnotation(handlerMethod, ResponseBody.class) != null) {

handleResponseBody(returnValue, webRequest);

return null;

}


添加自己的扩展方法:

else if (AnnotationUtils.findAnnotation(handlerMethod, ResponseBodyExt.class) != null) {

ResponseBodyExt bodyMi = AnnotationUtils.findAnnotation(handlerMethod, ResponseBodyExt.class);

handleResponseBodyExt(returnValue, webRequest, bodyMi);

return null;

}

定义handleResponseBodyExt方法:

private void handleResponseBodyExt(Object returnValue, ServletWebRequest webRequest, ResponseBodyMI bodyMi) throws Exception {

HttpServletResponse servletResponse = (HttpServletResponse) webRequest.getNativeResponse();

writeWithExtConverters(returnValue, servletResponse, bodyMi);

}

writeWithExtConverters()方法如下:

private void writeWithExtConverters(Object returnValue, HttpServletResponse response, ResponseBodyMI bodyMi) throws Exception {

convertToXML(...);

};


使用方式如下:

@RequestMapping(value="/getContractList")

@ResponseBodyExt(isCheck=true, resultType="sql", sqlColumns="ID,TUREID")

public Page getContractList(@RequestParamExt(value = "ds_search", type = "ds") Contract cp) throws Exception {

Page page = method1();

return page;

}
作者“菜园子”