読者です 読者をやめる 読者になる 読者になる

SpringMVCのControllerでURLを厳密に判定する

※利用バージョン 3.0.5.RELEASE


SpringMVCのControllerで以下のRequestMappingを定義すると、

@Controller
@RequestMapping("/regist")
public class RegistController {

  @RequestMapping("process")
  public String process(){
    ...
  }
...

以下のURLが処理される。(下3つは一例)

このように、デフォルトでは、”process/”や”process.*”が処理対象として登録される。(参考:setUseDefaultSuffixPattern

これを厳密に判定するようにするには、先に書いたsetUseDefaultSuffixPatternをfalseにする必要がある。(デフォルトではtrue)

ここで少しはまった。単純に以下を *-servlet.xml (e.g. spring-servlet.xml)に追加しても有効にならない。

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  <property name="useDefaultSuffixPattern" value="false"/>
</bean>

こことか見たら既存の問題かと思ったりしたが、どうも書き方が悪かったらしい。
の代わりに自分で上記設定含め、書く必要があった。(参考

※依存性やらでエラーになった部分はコメントアウトしている

<!--
  <mvc:annotation-driven />
-->
  <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="useDefaultSuffixPattern" value="false"/>
  </bean>
  
  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <!-- 
    <property name="webBindingInitializer">
      <bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
        <property name="validator" ref="validator" />
        <property name="conversionService">
          <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
        </property>
      </bean>
    </property>
     -->
    <property name="messageConverters">
      <list>
        <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
          <property name="writeAcceptCharset" value="false" />
        </bean>
        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
        <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
        <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
        <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
        <!-- 
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
         -->
      </list>
    </property>
  </bean>

これは @PathVariable で、値として最後のピリオド以降が取得できない問題にも対応出来る。


他参考)