Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

IT勉強会での初プレゼンなどお助けします!

勉強会でスピーカーをやりたいけど、プレゼンが初めて、苦手という方に無償でコーチできます。スライドのレビューや録画したリハへのアドバイスなどなど。Twitter@jyukutyoまでメンションでもDMでもお気軽にご連絡ください。

私はIT講師の経験があり、プレゼンはデブサミやJJUG CCCなど200人規模の経験が豊富で最大800人の前でプレゼンしました。海外ではDevoxxUSで。デブサミ2017では公募スピーカー1位、デブサミ関西2012アワードで5位となりました。

Spring MVCでリクエストパラメータを日付型に変換してControllerに渡す

だれかの海外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型に変換してくれる。