2011-07-13 10 views
7

Tomcat Apache 6.0環境で動作するSpring 3.0を使用してRESTfulサービスを開発しています。 Spring DispatcherServletは "/ spring/*"に設定されています。 Springサーブレットは複数のクライアントを処理し、アプリケーション内に多数のコントローラを持っています。私はRESTサービス用の新しいコントローラを追加しています。
http://<server>:<port>/<context>/spring/ws/service1パッケージ内のすべてのコントローラクラスのURLにプレフィックスを追加します。

私は春の注釈で見つけた唯一の方法は、以下のとおりです。私は、リソースへの完全なURLは次のようになりますように、私のコントローラクラスのすべてが「WS」(ウェブサービス)のような識別接頭辞を持つようにしたいですこのように@RequestMapping使用:

@Controller 
@RequestMapping("/ws/service1") 
public class Service1 { 

@RequestMapping(method=RequestMethod.GET) 
@ResponseBody 
public String getHtml() { ... } 

.... 
} 

しかし、私はクラスの数十を持っているので、私は、各クラスに「/ WS」接頭辞をつけたくありません。したがって、別の開発者が新しいサービスを追加した場合、このプレフィックスを覚えておく必要はなく、プレフィックス名を「/ ws」から別のものに変更する場合は、すべてのファイルを変更する必要はありません。 @RequestMapping注釈は、パッケージレベルではなく、メソッドまたはクラスにのみ適用可能であることがわかりました。

すべてのRESTコントローラに接頭辞を付けてアクセスする方法はありますか?

Springサーブレットのweb.xml URLマッピングは、そのURLで実行されている他のコントローラがあるため変更できません。

+0

最後の文が重要です - 「他のコントローラ」の意味を広げることができますか? – skaffman

+0

My SpringサーブレットはFlexクライアントを提供しており、そのためにBlazeDSコントローラを使用しています。 Tomcatサーバー自体も静的コンテンツを提供する必要があります。 RESTfulコントローラはそれに加えています。だから、私はSpringのサーブレットのURLを "/ *"または "/ ws/*"にマップすることはできません。 – Shreerang

答えて

5

Spring3のconvention over configurationサポート、具体的にはControllerClassNameHandlerMappingを参照してください。効果的には、URLの場所を@RequestMappingに定義しませんが、ハンドラのパッケージの場所によって定義されます。

マップされたURLにコントローラのパッケージ名が反映されるようにするには、のbasePackageプロパティを設定する必要があります。 documentation

Set the base package to be used for generating path mappings, including all subpackages underneath this packages as path elements. Default is null, using the short class name for the generated path, with the controller's package not represented in the path. Specify a base package like "com.mycompany.myapp" to include subpackages within that base package as path elements, e.g. generating the path "/mymodule/buyform" for the class name "com.mycompany.myapp.mymodule.BuyForm". Subpackage hierarchies are represented as individual path elements, e.g. "/mymodule/mysubmodule/buyform" for the class name "com.mycompany.myapp.mymodule.mysubmodule.BuyForm".

だから、たとえば豆の定義は

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> 
    <property name="basePackage" value="com.company.project"/> 
</bean> 
<context:component-scan base-package="com.company.project.ws"/> 

である場合がありますそして、あなたのコントローラは、私が実装

package com.company.project.ws; 
@Controller 
public class Service1 { 
    // your controller methods 
} 
+0

はい、私は実際にそれを調べました。パッケージ名を考慮したURLマッピングが可能かどうか教えてください。たとえば、完全修飾クラス名が "com.ws.Service1"の場合、URL "/ ws/service1"などにマップされますか? – Shreerang

+0

はい、可能です。参照では説明されていませんが、JavaDocには必要なポインタがあります。私はこれを達成する方法を反映するために答えを更新しました。パスにプレフィックスを付ける場合は、ControllerClassNameHandlerMappingのpathPrefixプロパティを参照することもできます。 – ptomli

+0

これは素晴らしいですが、私はそれを試しましたが、エラーの下になっています: ハンドラのためのアダプタがありません[[email protected]]:あなたのハンドラはコントローラ? 私はbeanを定義しましたが、 提案はありますか? – Shreerang

0

(非常に基本的でシンプルな)別のアプローチされたように見えるかもしれないと言います複数のDispatcherサーブレットを定義し、サーブレットごとに異なるURLをマップします。サーブレットはルートSpringコンテキストを共有し、それに加えて独自のBean定義を持ちます。詳しくはJava docをご覧ください。

だから、私のweb.xmlは次のようになります。

<servlet> 
    <servlet-name>flex</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<!-- Mappings for BlazeDS requests --> 
<servlet-mapping> 
    <servlet-name>flex</servlet-name> 
    <url-pattern>/spring/messagebroker/*</url-pattern> 
</servlet-mapping> 

<!-- Second dispatcher servlet for Web Services API --> 
<servlet> 
    <servlet-name>wsapi</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>wsapi</servlet-name> 
    <url-pattern>/spring/ws/*</url-pattern> 
</servlet-mapping> 

基本的に、私はそれがあるとして、既存のディスパッチャサーブレットを残し、唯一異なるURLマッピングとRESTコントローラの新しいサーブレットを追加しました。したがって、これらのサーブレットのURLを個別に制御できます。その後、各コントローラーにURLプレフィックスを付ける必要はありません。

関連する問題