標準フォームデータ、application/x-www-form-urlencoded; のコンテンツタイプを処理するように設計されたHttp POSTメソッドを介して多くのパラメーターを受け入れる既存のJersey Webサービスメソッドがありました。これらのパラメーターの 1 つは文字列のリストでした。以下は、私が持っているメソッド署名の例です。
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createItem(
@FormParam("p1") long p1,
@FormParam("p2") String p2,
@FormParam("p3") List<String> p3,
@FormParam("p4") String p4,
@Context UriInfo uriInfo
) throws SQLException {
これは正しく機能しており、リストに複数の p3 パラメータが渡されると、Jersey によって正しく生成され、メソッドに渡されます。
ここで、既存のパラメーターと共にファイルをアップロードできるように、マルチパート リクエストを受け入れるこのメソッドの代替バージョンを作成する必要がありました。そのため、以下に示す例のように、マルチパート リクエストを使用するために非常によく似たメソッド シグネチャを作成しました。
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response createItemWithFile(
@FormDataParam("p1") long p1,
@FormDataParam("p2") String p2,
@FormDataParam("p3") List<String> p3,
@FormDataParam("p4") String p4,
@FormDataParam("file") InputStream inputStream,
@Context UriInfo uriInfo
) throws SQLException {
マルチパート データを使用する場合に必要と思われるため、FormParam 注釈を FormDataParam に変更しました。RESTAssured を使用して JUnit テストからこのメソッドを呼び出そうとしましたが (元のメソッドで行ったのと同じです)、次のエラーが発生します。
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
いくつかのブレーク ポイントをジャージー コードに配置すると、スタック トレースで特定されたポイントのいくつかで、呼び出す正しいメソッドを特定したように見えますが、渡そうとするパラメーターのリストでは、p3 が省略されています。 .
マルチパート データを処理するときに入力としてリストを受け入れることをサポートするために行う必要がある別のことはありますか? これがオプションのパラメーターであることを考えると、とにかく省略できるはずだと思っていましたが、これは元のメソッドの場合です。
メソッドを呼び出すために使用されているテストの RESTAssured コードは次のとおりです。
Response response = given()
.header("my_header", "xyz")
.param("p1", "8000040")
.param("p2", "sample string")
.param("p3", "first_value")
.param("p4", "abcde")
.multiPart("file", myFile1, inputStream)
.expect()
RESTAssured テスト コードで formParam を param の代わりに使用した場合も試しましたが、同じ結果が得られました。
事前に感謝します。