2012-01-19 9 views
3

GWTサーブレットで単にフィールドを@Autowiredとマークしても、意図した通りに動作しません。コードがコンパイルされ、Webアプリケーションが起動します。つまり、Springがフィールドをautowireできるようになりましたが、サーブレットが実際にクライアント側のコードでヒットした場合、NullPointerExceptionが返されます。サーブレットがヒットします。SpringでGWTサーブレットのフィールドをオートワイヤリングするだけの理由はありませんか?

私はいくつかのSpringロジックを実行する基本サーブレットクラスを使用していますが、これはすべてのGWTサーブレットがこの基本クラスを拡張する必要があることを意味します。もう1つの方法は、AspectJとSpringアノテーションを使用することでした。ここにはほとんど設定が含まれておらず、魔法のように動作しました。

私の質問は、単にフィールドをオートワイヤリングするだけで、意図したとおりに動作しないのですか?これが壊れる原因となるGWTは何ですか?

答えて

0

少なくともSpringを使用すると、@Autowiredを使用できるように、これを行うための簡単な方法がたくさんあり、大量の構成クラスや基本クラスは含まれていません。 AspectJも使用しなければならないという警告があります。

@Configurable 
public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService 
{ 
    @Autowired 
    private MyService service; 

    // ... 
} 

をそして、あなたの春の設定であなたも持っていることを確認してください:ここでは、あなたのGWTのサーブレットのために必要なものです

<!-- enable autowiring and configuration of non-spring managed classes, requires AspectJ --> 
    <context:spring-configured/> 

最後の注意。 GWTアプリケーション(およびGWTサーブレット)でSpringセキュリティを使用している場合、AspectJ製織が正しく行われるように正しいモードを定義する必要があります(つまり、@Securedアノテーション処理と@Autowired処理)は次のものが必要です。

<!-- turn on spring security for method annotations with @Secured(...) --> 
    <!-- the aspectj mode is required because we autowire spring services into GWT servlets and this 
     is also done via aspectj. a server 500 error will occur if this is changed or removed. --> 
    <security:global-method-security secured-annotations="enabled" mode="aspectj"/> 
4

コードがコンパイルされ、Webアプリケーションが起動します - は春が正常に必ずしもフィールドに

をautowireすることができたことを意味します。 Webコンテナは、Springの助けを借りずにサーブレットをインスタンス化できます。あなたはどちらを経験することができます

をしかし、サーブレットは、実際にクライアント側のコードに見舞われたとき、それは は、NullPointerExceptionが得られます - ヒットされているサーブレットの異なる、初期化されていない コピーがありますように。

)(サーブレットのinitをオーバーライドしてみてください:

RPCサービスは、クライアントから呼び出され
@Override 
public void init(ServletConfig config) throws ServletException { 
    super.init(config); 

    WebApplicationContextUtils.getWebApplicationContext(config.getServletContext()) 
     .getAutowireCapableBeanFactory().autowireBean(this); 
} 
+0

、あなたの答えは、春の最初の部分では技術的に正しいですが、デフォルトでは、お菓子Autowired必要なので、それが構築されているかどうかを確認しますとして注釈フィールド/メソッド注釈付きアイテムに一致するBean。もしそうでなければ、それは爆発し、ウェブコンテナは起動しません。 – icfantv

+0

さらに、答えの2番目の部分では、Web上でこの解決策を見ましたが、注意点は、1)私のGWTサーブレットクラスをすべて拡張するために、親サーブレットクラスを作成する必要があります。 、2)このパターンは例外処理を混乱させ、例外がスローされたときの適切な処理を妨げます。 http://blog.maxmatveev.com/2011/02/simple-spring-bean-autowiring-in-gwt.htmlの著者のコメントを参照してください。これはAspectJを使用するソリューションです。 – icfantv

+0

基本クラスを作るために*必要ない*各サーブレットは自身のためにinit()をオーバーライドすることができます:) – milan

1

、「サーバー側は」と呼ばれるURLを見て、サーブレットマッピングは、クラスを見つけるだろう、インスタンスを作成し、要求を処理します。つまり、@Autowired注釈がある場合、または既に春の文脈でRPCクラスのインスタンスがある場合は、問題ではありません。新しいインスタンスが作成され、Springについて「認識」しません。

RemoteServiceServletを拡張し、Controller(Spring MVCから)とServletContextAwareを実装することでこれを解決します。あなたは元のために、Spring MVCのアプローチを使用してURLですべてのRPCサービスをマッピングすることができます この方法:

<bean id="publicUrlMapping" 
     class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
     <property name="mappings"> 
      <props> 
      <prop key="/myFirstRpc">firstRpcServiceBeanRef</prop> 
      <prop key="/mySecondRpc">secondRpcServiceRef</prop> 
      </props> 
     </property> 
    </bean> 

あなたはweb.xml内のすべての単一のRPCサーブレットの宣言をも避けるため、マッピングはクリーンであり、あなたは春の注射を持っています。 にorg.springframework.web.servlet.DispatcherServletの単一マッピングのみを指定します。にはすべて RPC呼び出しがあります。

Web上にGWT RPCとSpring MVCコントローラの統合についての説明がいくつかあります。

希望すると、これが役立ちます。

+0

Ack!ごめんなさい。私はSpring MVCを使用していないことを明確にしていませんでした。私がウェブ上で見つけた情報、つまり、コントローラ全体からのルールを取り入れるというパターンが本当に間違っていたとすれば、フレームワーク全体の要素を吸い込み、小さな部分だけを使うことになります。 – icfantv

+0

私にとって、Spring MVCの真のパワーは、同じような機能をグループ化し、コントローラメソッドをURIに結びつけ、メソッドごとにセキュリティを追加することができます。コーディング。 – icfantv

+0

ディスパッチャー・サーブレットを1つのコントローラーとルールを合わせて混在させていると思います。このサーブレットマッピングは、/ rpc/*のように、コントローラが使用するURLの一般的な定義を提供します。それがアイデアです。 Spring Securityのようなフレームワークを組み込んだら、まだメソッドレベルのセキュリティの可能性があります。 –

関連する問題