2009-05-12 13 views
5

私はRESTフルサービス(Tomcatが主催)を公開しようとしており、Spring 3(M3)に必要な設定は何か分からない。Spring 3(m3)上に構築されたREST完全アノテーション付きサービスの最小構成は何ですか?

これは、サービスがどのように見えるか(例)です:

<beans ...> 
    <context:annotation-config /> 
    <bean class="...AutowiredAnnotationBeanPostProcessor"/> 
    <bean class="...DefaultAnnotationHandlerMapping"> 
    <context:component-scan base-package="com.mycompany.myserver"/> 
</beans> 

この:

@Controller 
@Scope("prototype") 
public class UsersController 
{ 
    @RequestMapping(value="https://stackoverflow.com/users/hello", method=RequestMethod.GET) 
    public String hello() 
    { 
     return "hello, user!"; 
    } 
} 

私は、この(私は単純化のための完全なクラス名を省略)のように見えてきたSpring構成をSpringの設定をweb.xmlにどのように組み込んだのですか。

<listener> 
      <listener-class>...RequestContextListener</listener-class> 
    </listener> 
    <!-- Servlets --> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>...DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:*:dispatcher-servlet.xml</param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/services/*</url-pattern> 
    </servlet-mapping> 

私は最小限の設定(追加のservlet-config.xmlファイルなし)を作成します。このため、ディスパッチャを組み込みの構成に設定しています。

これは間違いありませんか?

私はTomcatを起動し、すべてのBeanは、私は、次のURLに移動していますロードされた後:「!こんにちは、利用者」ではなく、

http://localhost:8080/myserver/services/users/hello 

そして、あなたが気づくと私の現在の設定が新しい要求として、この要求を再ルーティングしようとしている、

09:54:45,140 DEBUG RequestContextListener:69 - Bound request context to thread: [email protected] 
09:54:45,140 DEBUG DispatcherServlet:834 - DispatcherServlet with name 'dispatcher' determining Last-Modified value for [/myserver/services/users/hello] 
09:54:45,156 DEBUG DefaultAnnotationHandlerMapping:178 - Mapping [/users/hello] to handler '[email protected]' 
09:54:45,171 DEBUG DispatcherServlet:850 - Last-Modified value for [/myserver/services/users/hello] is: -1 
09:54:45,171 DEBUG DispatcherServlet:683 - DispatcherServlet with name 'dispatcher' processing GET request for [/myserver/services/users/hello] 
09:54:45,218 DEBUG HandlerMethodInvoker:148 - Invoking request handler method: public java.lang.String com.symantec.repserver.myserver.UsersController.hello() 
09:54:45,218 DEBUG DefaultListableBeanFactory:1366 - Invoking afterPropertiesSet() on bean with name 'hello, user!' 
09:54:45,218 DEBUG DispatcherServlet:1060 - Rendering view [org.springframework.web.servlet.view.InternalResourceView: name 'hello, user!'; URL [hello, user!]] in DispatcherServlet with name 'dispatcher' 
09:54:45,234 DEBUG InternalResourceView:237 - Forwarding to resource [hello, user!] in InternalResourceView 'hello, user!' 
09:54:45,250 DEBUG DispatcherServlet:834 - DispatcherServlet with name 'dispatcher' determining Last-Modified value for [/myserver/services/users/hello, user!] 
09:54:45,250 DEBUG DispatcherServlet:842 - No handler found in getLastModified 
09:54:45,250 DEBUG DispatcherServlet:683 - DispatcherServlet with name 'dispatcher' processing GET request for [/myserver/services/users/hello, user!] 
09:54:45,250 WARN PageNotFound:959 - No mapping found for HTTP request with URI [/myserver/services/users/hello, user!] in DispatcherServlet with name 'dispatcher' 
09:54:45,250 DEBUG DispatcherServlet:643 - Successfully completed request 
09:54:45,250 DEBUG DispatcherServlet:643 - Successfully completed request 
09:54:45,250 DEBUG RequestContextListener:89 - Cleared thread-bound request context: [email protected] 

/myserver/services/users/hello, user! 

任意のアイデア回答は、私の失望に、私は、ログファイルに次のエラーを参照してくださいなにが問題ですか?私は何が欠けていますか?

答えて

1

問題があなたのhello()メソッドは、春にhandlerMethodとして注釈されているし、それが[文字列を返す場合@RequestMappingのドキュメントごとに、ハンドラメソッドは、オブジェクトの任意の数を返すかもしれないが、次のとおりです。

@Request Documentation

暗黙コマンドオブジェクトとModelAttribute注釈付き参照データアクセッサメソッドによって決定モデルと、ビュー名として解釈さ

A文字列値。存在しない - ハンドラメソッドはまた、プログラム

だから、それは基本的にあなたが返すその文字列 'こんにちは、ユーザーのマッピングを探しています(上記参照)ModelMap引数を宣言することにより、モデルを豊かにすることがあります。メソッドがvoidを返すようにして、メソッド内でHttpServletResponseに書き出すことができます。

さらに答え:

@RequestMapping(value="https://stackoverflow.com/users/hello", method=RequestMethod.GET) 
public void hello(Writer w) { 
    w.write("hello, user!"); 
    w.flush(); 
    return; 
} 

あなたは、ちょうど作家ではなく、あなたが適切なHTTPヘッダーを設定することができ、そのように全体のHttpServletResponseを取得することができます。

は、以下の私のコメントがごちゃ混ぜにされて申し訳ありませんが、私はこのサイトに新たなんです。

+0

うーん...しかし、それはメソッドの戻り値は、要求者に送信されることを主張し、全体JAX-RSのアイデアを、破壊されます。 上記の要件が成り立つように、メソッドにアノテーションを付ける方法はありますか? – IgorM

+1

javadocによると、あなたのメソッドは、あなたが書くためにServletOutputStream/WriterでRequestMapperが渡すOutputStreamまたはWriterの引数を受け取ります。私はこれが本当にこれについて最善の方法であるかどうかは分かりませんが、うまくいくでしょう。 @RequestMapping(value = "/ users/hello"、method = RequestMethod.GET) 公開空のhello(作者w) { w.write( "hello、user!"); w.flush(); リターン; } あなたは、ちょうど作家ではなく、あなたが適切なHTTPヘッダーを設定することができ、そのように全体のHttpServletResponseを取得することができます。 – Gandalf

+0

上記のようにストリームに直接レスポンスを書き込むことも、それを行うModelAndViewオブジェクトを返すこともできます。その効果はほとんど同じです。 春3は、メソッドの戻り値を処理するための新しいHttpMessageConverterパターンを使用しますが、ssdly彼らだけ@RequestBodyに適用する場合、それはいいだろう。彼らは春REST MVCは、彼らが作った明示的なチョイスだったこと、準拠したJAX-RS * *でないことを覚えておいてください春2.5 であったようにメソッドの戻り値は、まだ解釈されます。 JAX-RSはSpring MVCにうまく適合しませんでした。 – skaffman

関連する問題