web-dev-qa-db-ja.com

@Pathと正規表現(Jersey / REST)

[〜#〜] rest [〜#〜]プロジェクトでJerseyを使用していて、正規表現を使用する必要があります。

それについて掘るのは簡単です:

@Path("/resources")
public class MyResource {

   @GET
   @Path("{subResources:.*}")
   public String get(@PathParam("subResources") String subResources) {...}
}

しかし、このようにして、メソッドはリクエストを取得していますonly 1つのパラメータを渡した場合、例:

GET:.../resources/firstSubResource

1つ以上のパラメーターを使用する場合、メソッドはnotでリクエストを取得します。例:

GET:.../resources/firstSubResource/seccondSubResource/thirdSubResource


@Pathにvariableまたはtext valueが含まれている場合にのみ、正規表現を使用できます。例:

@Path("{SubResource1}/{subResources:.*}")

または

@Path("/hardCodeString/{subResources:.*}")

今日、私はこの変数のソリューションで実行することができましたが、私の観点ではOKではありません。


私のweb.xml

(...)
    <servlet>
        <servlet-name>Jersey Spring Web Application</servlet-name>
        <servlet-class>com.Sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
        <init-param>
            <param-name>com.Sun.jersey.config.property.packages</param-name>
            <param-value>com.myproject.rest</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Spring Web Application</servlet-name>
        <url-pattern>/1.0/*</url-pattern>
    </servlet-mapping>
(...)

質問

  • 誰かが何か関連したことをしたことがありますか?
  • 私は何か間違ったことをしていますか?
  • クラス内とメソッド内の2つ以上の@Pathを操作する場合、これはバグである可能性があると思います。
  • ヒントは大歓迎です!

よろしく

23
rafa.ferreira

JAX-RS 1.1の概要 に示されている正規表現を使用してみてください。

あなたの場合、コードスニペットは以下のようになります

@Path("resources/")
public class MyResource {

   @GET
   @Path("{subResources: [a-zA-Z0-9_/]+}")
   public String get(@PathParam("subResources") String subResources) {...}
}

お役に立てば幸いです。

21
jaga

私はこれが本当に古い質問であることを知っていますが、私は自分のための解決策を探している最中にそれを見つけました。 s3スタイルのファイル名、たとえば/folder/whatever/blah/.../image.jpgを受け入れようとしています。これは、考えられる長さで、多くの/sを含むことができます。

とにかくあなた自身の解決策:

@Path("/hardCodeString/{subResources:.*}")

私にアイデアを与えました...この作品が判明しました:

@Path("/{subResources:.*}")

最初の/に注目してください。おそらく3年後には、これは修正されたものか、それとも何でもですが、このページがこの苦境について言及している唯一の場所であると思われるため、これが誰かの助けになることを願っています。

9
paullth

@ PathParamアノテーションを削除して、代わりにriInfoでパスを取得できますか?

@Context UriInfo uriInfo;

@GET
@Path("{subResources:.*}")
public String get() 
{
    String path = uriInfo.getPath();
}

理由はわかりませんが、私のアプリケーションで機能します。

6
user306708

トークンで区切られたサブリソースのコレクションを表す単一のPathParamを受け入れることに反対しますか?

例えば ​​...

@Path( "/ resources)
 public class MyResource {
 
 @GET 
 @Path(" {subResources} ")
 public String get (@PathParam( "subResources")文字列subResources)
 {
 String [] params = StringUtils.split(subResources、 ";"); 
} 
}

..処理する必要があります

 GET:.../resources/firstSubResource 
&
 GET:.../resources/firstSubResource; seccondSubResource; thirdSubResource 
0
P. Deters