だれかの海外blogから。
Controllerにこういうメソッドがあるとして、Spring MVCではリクエストパラメータをDateに変換してくれない。
@RequestMapping(method = { RequestMethod.POST }) public MappingJacksonJsonView methodName(@RequestParam("date") Date date) { ... }
java.beans.PropertyEditorインタフェースを実装したクラスを作って、登録すると変換してくれる。
インタフェースをそのまま使うよりもjava.beans.PropertyEditorSupportクラスを継承して作成するとラク。
import java.beans.PropertyEditorSupport; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateTypeEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); Date date = null; try { date = format.parse(text); } catch (ParseException e) { // nop } setValue(date); } }
そしてWebBindingInitializerインタフェースを実装したクラスを作り、PropertyEditorクラスを登録する。
import java.util.Date; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.support.WebBindingInitializer; import org.springframework.web.context.request.WebRequest; public class GlobalBindingInitializer implements WebBindingInitializer { @Override public void initBinder(WebDataBinder binder, WebRequest request) { binder.registerCustomEditor(Date.class, new DateTypeEditor()); } }
MVCのAnnotationMethodHandlerAdapterに作成したGlobalBindingInitializerクラスを登録する。
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="webBindingInitializer"> <bean class="xxx.xxx.GlobalBindingInitializer" /> </property> </bean>
これでDate型に変換してくれる。