[ Java Spring3 ] @RequestMapping の value 属性にワイルドカード(*)を設定する

Pocket

spring3 フレームワークのコントローラでは、以下のように @RequestMapping アノテーションを使用して URL と起動されるクラスメソッドをマッピングすることができます。ここでは、value 属性にワイルドカード ( * ) を指定したときのマッピング動作を検証してみたいと思います。

スポンサーリンク

@RequestMapping アノテーションの設定例
@Controller
public class SampleController 
{
    @RequestMapping(value = "/Controller10/action/")
    private void Dispatcher() 
    {
        System.out.println("Request!!");
    }
}
ワイルドカードなし

設定例:@RequestMapping(value = “/Controller/action/”)

リクエストURL 実行される
http://hostname/Controller/action/
http://hostname/Controller/action
http://hostname/Controller/action/test ×
http://hostname/Controller/actiontest ×
ワイルドカード指定 その1

設定例:@RequestMapping(value = “/Controller/*”)

リクエストURL 実行される
http://hostname/Controller/action/
http://hostname/Controller/?key=value
http://hostname/Controller?key=value ×

NG 理由は、パラメータの前にスラッシュがついていないためです。

ワイルドカード指定 その2

設定例:@RequestMapping(value = “/Controller*”)

リクエストURL 実行される
http://hostname/ControllerTest
http://hostname/Controller/Test
@RequestMapping で例外

@RequestMapping で複数のメソッドを同一の URL にマッピングすることはできません。HTTP レスポンス 500 が返されます。

例外が発生し、レスポンス 500 が返される設定例

@Controller
public class SampelController 
{
    @RequestMapping(value = "/Controller/", method = { RequestMethod.GET })
    private void func1() 
    {
        System.out.println("func1");
    }

    // 同一のURLに複数メソッドをマッピングする
    @RequestMapping(value = "/Controller/", method = { RequestMethod.GET })
    private void func2() 
    {
        System.out.println("func2");
    }
}

リクエスト結果

マッピングエラー

マッピングエラー


HTTPステータス 500 - サーブレット Spring MVC Dispatcher Servlet のServlet.init()が例外を投げました

--------------------------------------------------------------------------------

type 例外レポート

メッセージ サーブレット Spring MVC Dispatcher Servlet のServlet.init()が例外を投げました

説明 The server encountered an internal error that prevented it from fulfilling this request.

例外 

javax.servlet.ServletException: サーブレット Spring MVC Dispatcher Servlet のServlet.init()が例外を投げました
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Unknown Source)


原因 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'sampleController' bean method 
private void SampleController.func2()
to {[/Controller/],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'sampleController' bean method
private void SampleController.func1() mapped.
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1482)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
	org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
	org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
	org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
	org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
	org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)
	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
	org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)
	org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459)
	org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
	javax.servlet.GenericServlet.init(GenericServlet.java:212)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Unknown Source)


原因 

java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'sampleController' bean method 
private void SampleController.func2()
to {[/Controller/],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'sampleController' bean method
private void SampleController.func1() mapped.
	org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:172)
	org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:146)
	org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:108)
	org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:88)
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:163)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
	org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
	org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
	org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
	org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
	org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)
	org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
	org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)
	org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459)
	org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
	javax.servlet.GenericServlet.init(GenericServlet.java:212)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Unknown Source)

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *