在@InitBinder带注释的方法中使用@RequestParam注释,然后手动设置所需的值。
UserController
@InitBinder(value="user") public void bind(WebDataBinder dataBinder, WebRequest webRequest, @RequestParam(value="pass", required=false) String password) { User user = (User) dataBinder.getTarget(); user.setPassword(password); }有没有一种方法可以使用注释来处理差异,或者我必须始终匹配名称?
AFAIK在Spring MVC中没有现成的注释可以解决您的问题;您需要自定义设置来处理这种情况。
WebModelAttribute
@Target({ElementType.METHOD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@documentedpublic @interface WebModelAttribute {String modelAttributeName(); WebParameterMapping[] parameterMappings();}WebParameterMapping
@Target({ElementType.METHOD, ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@documentedpublic @interface WebParameterMapping { String webProperty(); String beanProperty();}UserController
@Controllerpublic class UserController extends AbstractController { @Override @InitBinder(value="user") @WebModelAttribute(modelAttributeName="user", parameterMappings={@WebParameterMapping(webProperty="pass", beanProperty="password")}) protected void bindWebParameters(WebDataBinder dataBinder, WebRequest webRequest, WebParameterResolver mappingResolver) { super.bindWebParameters(dataBinder, webRequest, mappingResolver); }抽象控制器
public class AbstractController { protected void bindWebParameters(WebDataBinder dataBinder, WebRequest webRequest, WebParameterResolver mappingResolver) { if(mappingResolver != null && dataBinder.getTarget() != null && dataBinder.getObjectName().equals(mappingResolver.getModelAttributeName())) { String[] allowedFields = mappingResolver.getAllowedFields(dataBinder.getAllowedFields()); String[] disallowedFields = mappingResolver.getDisallowedFields(dataBinder.getDisallowedFields()); dataBinder.setAllowedFields(allowedFields); dataBinder.setDisallowedFields(disallowedFields); dataBinder.bind(mappingResolver.getPropertyValues(dataBinder, webRequest)); } }}WebParameterResolver
public class WebParameterResolver { private String modelAttributeName; private WebParameterMapping[] parameterMappings; public WebParameterResolver(String modelAttributeName, WebParameterMapping[] parameterMappings) { this.modelAttributeName = modelAttributeName; this.parameterMappings = parameterMappings; } public String getModelAttributeName() { return modelAttributeName; } public String[] getDisallowedFields(String[] existingDisallowedFields) { List<String> disallowedFields = new ArrayList<String>(); for (WebParameterMapping parameterMapping : parameterMappings) { disallowedFields.add(parameterMapping.webProperty()); } if (existingDisallowedFields != null) { for (String disallowedField : existingDisallowedFields) { disallowedFields.add(disallowedField); } } return disallowedFields.toArray(new String[disallowedFields.size()]); } public String[] getAllowedFields(String[] existingAllowedFields) { List<String> allowedFields = new ArrayList<String>(); for (WebParameterMapping parameterMapping : parameterMappings) { allowedFields.add(parameterMapping.beanProperty()); } if (existingAllowedFields != null) { for (String allowedField : existingAllowedFields) { allowedFields.add(allowedField); } } return allowedFields.toArray(new String[allowedFields.size()]); } public MutablePropertyValues getPropertyValues(WebDataBinder dataBinder, WebRequest webRequest) { MutablePropertyValues propertyValues = new MutablePropertyValues(); for (WebParameterMapping parameterMapping : parameterMappings) { String[] values = webRequest.getParameterValues(parameterMapping.webProperty()); if (values == null || values.length == 0) { // do nothing } else if (values.length == 1) { propertyValues.add(parameterMapping.beanProperty(), values[0]); } else { propertyValues.add(parameterMapping.beanProperty(), values); } } dataBinder.bind(propertyValues); return propertyValues; }}CustomArgumentResolver
public class CustomArgumentResolver implements WebArgumentResolver { @Override public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception { if(methodParameter.getParameterType().equals(WebParameterResolver.class)) { WebModelAttribute webModelAttribute = methodParameter.getMethod().getAnnotation(WebModelAttribute.class); if(webModelAttribute == null) { throw new RuntimeException("method must have WebModelAttribute"); } return new WebParameterResolver(webModelAttribute.modelAttributeName(), webModelAttribute.parameterMappings()); } return UNRESOLVED; }}beans.xml
<bean id="handlerAdapter" > <property name="customArgumentResolvers" ref="timetracking.annotations.CustomArgumentResolver"/> </bean><bean name="timetracking.annotations.CustomArgumentResolver" />
您还可以
public static voidbindWebParameters(...)在一些帮助程序类中使用方法。因此您不必每次都扩展AbstractController。



