4

最初、Web サーバーには REST サーブレットが 1 つしかありませんでした。何かのようなもの:

@Path("/")
public class Controller {
  @GET
  @Produces({ MediaType.TEXT_HTML })
  public Response get(@Context UriInfo info) throws Exception {
    ...
  }

  @GET
  @Path("resource1")
  @Produces({ MediaType.TEXT_HTML })
  public Response resource1() throws Exception {
    ...
  }

  ...

 }

そしてweb.xml:

 <servlet>
    <servlet-name>rest</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>xpto.mypack1;xpto.mypack2</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>rest</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

しかし、サーバーに静的な html を追加したかったので、サーブレットのマッピングを /rest/* に更新しました。

「/」から「/rest」へのControllerサーブレットクラスの@Pathディレクティブ。すべて正常に動作しますが、 @path ディレクティブを使用したコントローラーのサブリソースまたはメソッドが動作を停止しました..つまり:

  • / ルートに index.html ページがあるため、正常に動作します
  • /rest は正常に動作し、サーブレットの get メソッドを呼び出します
  • /rest/resource1 は 404 http コードを返します...

何か助けはありますか?各 @Path ディレクティブの前後の / の組み合わせのリストを既に試しましたが、成功しませんでした... どうもありがとう

1 つの更新:

trace util を使用したところ、次の結果が得られました。

/[app-name]/rest の場合 (動作します):

  • X-Jersey-Trace-002 は右側のパスを受け入れます java.util.regex.Matcher[pattern=/rest(/.*)? region=0,11 lastmatch=/rest]: "/rest" -> "/rest" : ""
  • X-Jersey-Trace-003 受け入れリソース: "rest" -> @Path("/rest") xpto.mypack.Controller
  • X-Jersey-Trace-000 はルート リソース クラスを受け入れます: "/rest"
  • X-Jersey-Trace-001 一致パス "/rest" -> "/application.wadl(/. )?", "/rest(/. )?"

/[app-name]/rest/resource1 の場合 (動作しません):

  • X-Jersey-Trace-002 一致例外マッパー: com.sun.jersey.api.NotFoundException@4fd41dc3 -> xpto.myclass
  • X-Jersey-Trace-003 は例外を応答にマップしました: com.sun.jersey.api.NotFoundException@4fd41dc3 -> 404 (見つかりません) X-Jersey-Trace-000 はルート リソース クラスを受け入れます: "/resource1" X-Jersey- Trace-001 一致パス "/resource1" -> "/application.wadl(/. )?", "/rest(/. )?"

誰かが私を助けてくれることを願っています..

4

1 に答える 1

5

サーブレット マッピングを として定義する場合は、リソースのアノテーションで/rest/*繰り返さないでください。つまり、コントローラーをそのままにして(上記の質問で)、サーブレットのマッピングを変更するだけです。リソースが利用できる URL は次のとおりです。/rest@Path

<application_context_path>/<servlet_mapping>

したがって、@Pathアノテーションを から@Path("/")@Path("rest")変更し、サーブレット マッピングも に変更すると/rest、リソースは次の場所で利用できるようになります。

<application_context_path>/rest/rest/*
于 2012-09-10T09:14:17.047 に答える