私は独自のController
andを実装することで解決策を見つけることができましたConfig
。
ビューサーブレット.xml
<mvc:resources mapping="/static/**" location="/static/"/>
<context:component-scan base-package="com.example.web.view"/>
com.example.web.view.ViewConfig
@Configuration
public class ViewConfig {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/views/");
vr.setSuffix(".jsp");
return vr;
}
@Bean RequestMappingHandlerMapping requestMappingHandlerMapping(){
return new RequestMappingHandlerMapping();
}
@Bean RequestMappingHandlerAdapter requestMappingHandlerAdapter(){
RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();
adapter.setOrder(2); //process after mvc:resources
return adapter;
}
}
com.example.web.view.ViewController
@Controller
public class ViewController {
@RequestMapping(value = "**/")
public String all(HttpServletRequest request) {
String path = request.getRequestURI().replace(request.getContextPath(),"");
return path.endsWith("/") ? path +"index" : path;
}
}
マジックは、アダプタで順序値を設定することでしたViewConfig
。RequestMapping
Spring は、 component-scan によって見つかったすべての が追加されるデフォルトのマッピング ハンドラーを作成します。私の初期セットアップが失敗した理由は、このハンドラーの順序が によって登録されたハンドラーの前に一致することでしたmvc:resources
。独自のアダプターを作成し、mvc:resources
両方が機能するようにした後に処理する順序を設定します。
これに関する情報は、春のドキュメント19.9.1 注釈サポートのためのディスパッチャの設定 にあります。
もちろん、ViewConfig は純粋に xml で実装することもできます。
<mvc:resources mapping="/static/**" location="/static/"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="order" value="2"/>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<context:component-scan base-package="com.example.web.view"/>
更新: Spring 3.1.x 以降で行われた変更を反映するために、 toRequestMappingHandlerMapping
およびRequestMappingHandlerAdapter
fromDefaultAnnotationHandlerMapping
に変更されました。AnnotationMethodHandlerAdapter