2013-04-29 10 views
5

更新:どうにかして、調整と再デプロイメントの別のラウンドを経て、localhost:8080/ping-1.0/pingが機能し始めました。設定ファイルはまだ以下の通りです。私はそれを知らずに私が修正したものを知っていればいいと思うが、今解決されている。Tomcatで呼び出されていないSpring MVCコントローラ

私は数日間この問題に取り組んできましたが、私がここや他の場所で見たあらゆる種類のソリューションを試してみました。私はSpring MVCコントローラをTomcatにデプロイしましたが、アクセスできません。

ツール:

スプリング3.2.0
のTomcat 7
のJava 1.6

スプリングコントローラ:

@Controller 
public class PingController { 

@RequestMapping("/ping") 
public String ping (Model model) throws Exception { 
    System.out.println("ping ping ping"); 
    String s = (new Date()).toString(); 
    model.addAttribute("message", s); 
    return "ping"; 
} 
} 

のweb.xml:

<?xml version="1.0" encoding="UTF-8"?> 

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

<servlet> 
    <servlet-name>ping</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/ping-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>ping</servlet-name> 
    <url-pattern>/ping</url-pattern> 
</servlet-mapping> 

</web-app> 

PING-サーブレット.xml:

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<context:component-scan base-package="myclass.ping"/> 

<mvc:annotation-driven /> 
</beans> 

WARファイルはping-1.0.warと呼ばれます。展開はうまくいくようです。私はcatalina.logで$ CATALINA_BASE/webappsにし、この中でのping-1.0というディレクトリを参照してください。

Tomcatはポート8080で実行されている
INFO: Mapped "{[/ping],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String myclass.ping.PingController.ping(org.springframework.ui.Model) throws java.lang.Exception 

私はローカルホストにアクセスすることができます。例えば8080 /マネージャを。しかし、localhost:8080/pingはTomcatから404メッセージを返します。ログにはGETリクエストのレコード以外は何も表示されません。エラーは一切ありません。リクエストマッピング、URLフィルタなどのバリエーションをたくさん試してみましたが、これを動作させることはできません。

+3

展開コンテキストの名前をURLに追加する必要があります。 foo.warをデプロイした場合、URLはhttp:// localhost:8080/foo/pingになります。あなたのためには、http:// localhost:8080/ping-1.0/ping – duffymo

+0

です。すでに試しました。うまくいかなかったのです。 – pmext

+0

'PingController'が置かれているパッケージは何ですか –

答えて

3

URLにコンテキストルートがなく、実際には/ping/pingが必要です。ディスパッチャーサーブレットとpingコントローラの両方が/pingにマップされているためです。これを試してみてください:

http://localhost:8080/ping-1.0/ping/ping 
+0

既に試してみました。同じ404メッセージ。 – pmext

+0

おっと、ディスパッチャーサーブレットも '/ ping'にマップされていることに気付かなかったので、あなたは'/ping-1.0/ping/ping 'を押してあなたのpingコントローラにヒットする必要があります。正しいURLで回答してください。副次的なこととして、私は通常、ディスパッチャーサーブレットが '/'のようなより広範なものにマップされることを期待しています。 – clav

+0

ありがとうございました。これについての私の頭を壊す..完全にweb.xmlの/ app/*を忘れてしまった –

0

私はあなたが間違ってSpringを設定したと思います。

私はサーブレットがあなたのpingコントローラではなく、Springのディスパッチャサーブレットであると考えています。これは、要求をどこにルーティングするかを決定するものです。フロントコントローラサーブレットがありません。

私はSpring 2.x以前を考えている可能性があります。 Spring 3.xがディスパッチャーの必要性を変更した場合、私は間違っていると認めます。しかしそれが私のアプリケーションのセットアップ方法です。

3
@RequestMapping("/ping") 

手段ディスパッチャサーブレットがリッスンURLへ/ping相対。

<url-pattern>/ping</url-pattern> 

ここで問題が発生します。これにより、ディスパッチャーサーブレットは1つのURLと1つのURLのみをlistenします。そして、それは仮定してlocalhost:8080/ping-1.0/pingです。しかし、あなたのコントローラーメソッドはそれに比例しているので、localhost:8080/ping-1.0/ping/pingであり、ディスパッチャーサーブレットはそのURLに反応しません。今ディスパッチャサーブレットがすべてのURLに聞くことができlocalhost:8080/ping-1.0/pingで始まる

<url-pattern>/ping/*</url-pattern> 

:あなたはパターンを使用する必要があります。

最終的なメモ:設定によっては、ping-1.0を省略する必要があります。

関連する問題