Spring Boot で redirect: とかなってるやつを自分で拡張したい
通常の Spring Boot では redirect:/
とか書くと、Moved Temporaly になるけど Moved Permanently 返したいときがある。
そんなとき、以下のような答えがインターネッツを検索していると出てくる。
@ResponseStatus(value=HttpStatus.MOVED_PERMANENTLY)
ってコントローラメソッドに付与するって方法がある- メソッド全体にかかってくるのがダサい。
httpServletReqeust.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, 302)
でやる- わかりづらい
そういうわけで、redirect301:/hoge/
とかでできるようにしたらいいんじゃないかと思いつく。
この似非 URL みたいなやつは ViewResolver ってやつがハンドリングしている。
ViewResolver は https://github.com/spring-projects/spring-framework/blob/554bf49/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java#L700 のへんで集められるが、要するに DI で ViewResolver をねじ込めば良い。
Spring Boot の場合、以下のようにすればよい。ViewResolver は複数指定できて、順番に呼び出される感じになっている。apache module のような呼びだされ方を想定しておけば良い。
@Slf4j
@Configuration
public class WebConfig implements ServletContextAware {
@Bean
public ViewResolver myViewResolver() {
return (viewName, locale) -> {
final String header = "redirect301:";
if (viewName.startsWith(header)) {
String redirectUrl = viewName.substring(header.length());
RedirectView view = new RedirectView(redirectUrl, true, true);
view.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
return view;
} else {
return null; // DECLINED
}
};
}
}