空字符串轉為null
現在我遇到這樣一個需求,那就是我想要吧前端傳過來的值變為空,因為所謂前端的校驗,其實都不是校驗,如果前端傳給后台一個表單,可是表單未填入值,我們后台進行判斷的時候 既需要判斷null,同時需要判斷是否為""
, 並且如果你不希望數據庫插入的是空字符串,而是null
,那么轉換和插入的就很麻煩
if (manager.getUsername().equals("") || manager.getUsername() == null) { throw new ErrorException("用戶名未填寫"); } if (manager.getPassword().equals("") || manager.getPassword() == null) { throw new ErrorException("密碼未填寫"); }
可是如果你在SpringMVC進行參數賦值處理之前就能把""
轉換為null
,那么你就只需要進行如下判斷,並且插入數據庫的一直是空值
if (manager.getUsername() == null) { throw new ErrorException("用戶名未填寫"); } if (manager.getPassword() == null) { throw new ErrorException("密碼未填寫"); }
實現方式
- 可以使用過濾器/攔截器把空字符串設置成null(未嘗試)
- 注冊一個SpringMVC
HandlerAdapter
來進行處理
使用SpringMVC時,所有的請求都是最先經過DispatcherServlet的,然后由DispatcherServlet選擇合適的HandlerMapping和HandlerAdapter來處理請求,HandlerMapping的作用就是找到請求所對應的方法,而HandlerAdapter則來處理和請求相關的的各種事情。我們這里要講的請求參數綁定也是HandlerAdapter來做的。
參數處理器
我們需要寫一個自定義的請求參數處理器,然后把這個處理器放到HandlerAdapter中,這樣我們的處理器就可以被拿來處理請求了。
public class EmptyStringToNullModelAttributeMethodProcessor extends ServletModelAttributeMethodProcessor implements ApplicationContextAware { ApplicationContext applicationContext; public EmptyStringToNullModelAttributeMethodProcessor(boolean annotationNotRequired) { super(annotationNotRequired); } @Override protected void bindRequestParameters(WebDataBinder binder, NativeWebRequest request) { EmptyStringToNullRequestDataBinder toNullRequestDataBinderBinder = new EmptyStringToNullRequestDataBinder(binder.getTarget(), binder.getObjectName()); RequestMappingHandlerAdapter requestMappingHandlerAdapter = applicationContext.getBean(RequestMappingHandlerAdapter.class); requestMappingHandlerAdapter.getWebBindingInitializer().initBinder(toNullRequestDataBinderBinder, request); toNullRequestDataBinderBinder.bind(request.getNativeRequest(ServletRequest.class)); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }
DataBinder
繼承自ExtendedServletRequestDataBinder
,主要用來自定義數據綁定處理
public class EmptyStringToNullRequestDataBinder extends ExtendedServletRequestDataBinder { public EmptyStringToNullRequestDataBinder(Object target, String objectName) { super(target, objectName); } protected void addBindValues(MutablePropertyValues mpvs, ServletRequest request) { super.addBindValues(mpvs, request); for (PropertyValue propertyValue : mpvs.getPropertyValueList()) { if (propertyValue.getValue().equals("")) propertyValue.setConvertedValue(null); } } }
注冊器
話要從HandlerAdapter里系統自帶的處理器說起。我這邊系統默認帶了24個處理器,其中有兩個ServletModelAttributeMethodProcessor,也就是我們自定義處理器繼承的系統處理器。SpringMVC處理請求參數是輪詢每一個處理器,看是否支持,也就是supportsParameter方法, 如果返回true,就交給你出來,並不會問下面的處理器。這就導致了如果我們簡單的把我們的自定義處理器加到HandlerAdapter的Resolver列中是不行的,需要加到第一個去。
public class EmptyStringToNullProcessorRegistry implements ApplicationContextAware, BeanFactoryPostProcessor { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { RequestMappingHandlerAdapter requestMappingHandlerAdapter = applicationContext.getBean(RequestMappingHandlerAdapter.class); List<HandlerMethodArgumentResolver> resolvers = requestMappingHandlerAdapter.getArgumentResolvers(); List<HandlerMethodArgumentResolver> newResolvers = new ArrayList<HandlerMethodArgumentResolver>(); for (HandlerMethodArgumentResolver resolver : resolvers) { newResolvers.add(resolver); } EmptyStringToNullModelAttributeMethodProcessor processor = new EmptyStringToNullModelAttributeMethodProcessor(true); processor.setApplicationContext(applicationContext); newResolvers.add(0, processor); requestMappingHandlerAdapter.setArgumentResolvers(Collections.unmodifiableList(newResolvers)); } }
XML配置
<mvc:annotation-driven> <mvc:argument-resolvers> <bean class="studio.geek.databind.EmptyStringToNullModelAttributeMethodProcessor"> <constructor-arg name="annotationNotRequired" value="true"/> </bean> </mvc:argument-resolvers> </mvc:annotation-driven>
最后就可以完成將空字符串轉為null
參考文檔
http://www.cnblogs.com/morethink/p/6435736.html