2017-07-27 12 views
1

私はSpring MVCに基づいてコントローラを作成しました。 ;私は "http://localhost/app/hello" にアクセスすると、私は404を得る"http:// localhost/app/hello"と "http:// localhost/app/hello /"の違いは何ですか?

@Controller 
@RequestMapping("/hello") 
public class JsonController { 

    @RequestMapping(value="/",method=RequestMethod.GET) 
    @ResponseBody 
    public Person service(){ 
     Person person=new Person(); 
     person.setId(3); 
     person.setName("666"); 
     return person; 
} 

"http://localhost/app/hello/"にアクセスすると、202 OKになります。 "http://localhost/app/hello"と "http://localhost/app/hello/"の違いは何ですか?

+5

まあ有効な応答を返します

@RequestMapping(method=RequestMethod.GET) public Person defaultAction() { ----your code } 

'@RequestMapping(value ="/"、method = RequestMethod.GET)'で 'service()'関数を終了し、最後に '/'のないURLは何もマッピングされません。あなたが残りのAPIに何も割り当てられていないURLを呼び出すと、自然に404が得られます。 – Nico

答えて

3

は、あなたのコントローラのコード

@RequestMapping("/hello") 
public class JsonController 

を見てあなたは、コントローラのURLマッピング持っている - > "/ hello" を

を、アクション(サービス)のURLマッピングは、 "/"

です
@RequestMapping(value="/",method=RequestMethod.GET) 
    @ResponseBody 
    public Person service() 

ここでコントローラのマッピングを提供するたびにその後、を持つすべてのコントローラのアクション(URLマッピングがコントローラで定義されている場合)は「hello /」あなたはとあなたのコントローラマッピングを述べてきたように、接頭辞としてコントローラのURLパスを必要とする、アクションサービス URLマッピング「/」 ので、あなたがしてサービスアクションにアクセスする必要がある場合 - > (リクエストURLマッピングがコントローラで定義した場合)あなたは、コントローラのBasePath変数を必要とする+アクションURLマッピング

-> "/hello" + "/" => "/hello/" 

ので、アクセスの場合URL "http://localhost/app/hello/ "で簡単にserviceアクションを見つけて応答を返しました

URL「」にアクセスしようとすると、URLマッピングはこのマッピングを検索し、(あなたのケースで定義されているため)コントローラマッピングで検索します何のアクションも定義されていないので、なぜ404を取得していますか?

あなたが好きなアクションをデフォルトそれを定義することができますので、今はこれを「http://localhost/app/helloを」ヒットするかどうか、あなたは違いはあなたが `/`をマッピングされていることではありません404

1

私は、あなたのTomcatリダイレクト設定と関係があると思います。リダイレクトされるWebアプリケーションのコンテキストルートのために要求し、必要であれば、むしろマッパーで(最後のスラッシュを追加する)、有効にした場合:以下

DESCをmapperContextRootRedirectEnabled

あなたのcontext.xmlの属性を含めてみてくださいデフォルトのServletよりも優れています。これはより効率的ですが、コンテキストパスが存在することを確認するという副作用があります。指定しない場合は、デフォルト値のtrueが使用されます。

はDESC

をmapperDirectoryRedirectEnabled:有効にした場合、Webアプリケーションディレクトリに対する要求は、必要に応じてマッパーではなく、デフォルトのサーブレットで(最後のスラッシュを追加する)リダイレクトされます。これはより効率的ですが、ディレクトリが存在することを確認するという副作用があります。指定しない場合は、デフォルト値のfalseが使用されます。

参考:https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Context_Parameters

関連する問題