0

現在、次のweb.xml構成があります。

<servlet>
    <servlet-name>Website</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Website</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>Server</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Server</servlet-name>
    <url-pattern>/server/</url-pattern>
</servlet-mapping>

2 つのコントローラーの例については、次のとおりです。

@Controller
public class ApiRequests {
    protected final Logger logger = Logger.getLogger(ApiRequests.class);

    @RequestMapping(value = "api.json", produces = {"application/json"}, method = RequestMethod.GET)
    @ResponseBody
    public String handleActionJson(final HttpServletRequest request){
        return "{test: 'blaat'}";
    }
}

@Controller
@RequestMapping("/")
public class IndexController {
    @RequestMapping("*.html")
    public void showIndex(){

    }
}

ここで私の問題は、/server/api.json URL を呼び出そうとすると、サーバーが json 応答を返さず、代わりに次のエラーが表示されることです。

PageNotFound:1108 - No mapping found for HTTP request with URI [/WorldDefense/server/api.json] in DispatcherServlet with name 'Website'

これは基本的に、サーバー サーブレットではなく Web サイト サーブレットで /server/api.json を検索しようとしていることを意味します。(つまり、/server/ を Server サーブレットにマップし、他のすべての URL の組み合わせを Website サーブレットにマップします)

編集 1 Costi Ciudatu によって提案された変更を反映するようにコードを更新しましたが、それでも機能しません。@RequestMapping("/server") を削除し、現在は handleActionJson メソッドに @RequestMapping しかありません。どちらも次のエラーが発生します。

10:57:26,046  WARN PageNotFound:1108 - No mapping found for HTTP request with URI [/WorldDefense/server/server/api.json] in DispatcherServlet with name 'Website'
10:57:40,509  WARN PageNotFound:1108 - No mapping found for HTTP request with URI [/WorldDefense/server/api.json] in DispatcherServlet with name 'Website'

tomcat ログによるマッピング:

サーバーサーブレット

11:03:49,655  INFO RequestMappingHandlerMapping:178 - Mapped "{[/api.json],methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}" onto public java.lang.String com.world2.worlddefense.server.controllers.ApiRequests.handleActionJson(javax.servlet.http.HttpServletRequest)
11:03:50,125  INFO RequestMappingHandlerMapping:178 - Mapped "{[/api.json],methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}" onto public java.lang.String com.world2.worlddefense.server.controllers.ApiRequests.handleActionJson(javax.servlet.http.HttpServletRequest)

ウェブサイトサーブレット

11:03:50,380  INFO RequestMappingHandlerMapping:178 - Mapped "{[//*.html],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public void com.world2.worlddefense.website.controllers.IndexController.showIndex()
11:03:50,381  INFO RequestMappingHandlerMapping:178 - Mapped "{[/login],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.world2.worlddefense.website.controllers.TempTestController.showTest()
4

1 に答える 1

1

DispatcherServlet同じで複数の を定義web.xmlし、必要に応じてそれらをマップできます。@RequestMappingただし、サーブレット マッピングはコントローラに反映されるべきではありません。コントローラーは常に、サーブレット マッピングに関連するパスにマップされます。あなたの場合、試してみるとそのJSON応答を取得できると思います/WorldDefence/server/server/api.json...

2 つのディスパッチャーに異なるコントローラーを関連付ける場合は、対応するアプリケーション コンテキストに適切なコントローラーが読み込まれていることを確認するだけで済みWebsite-servlet.xmlますServer-servlet.xml

簡単に言うと、マッピングApiRequestsは「/server」ではなく「/」にする必要があり、そのコントローラーは「サーバー」ディスパッチャーコンテキストにのみ含める必要があります。

補足として、3.2.x 以降、.json拡張機能は ContentNegotiationManager によって処理されるため、コントローラーは、Spring HttpMessageConverter メカニズムによって透過的にマーシャリングされるドメイン オブジェクトを返す必要があり、JSON 以外のメディア タイプを生成できます。努力。

于 2013-03-19T09:39:43.347 に答える