web-dev-qa-db-ja.com

Jerseyを使用してRESTfulサービスのPOSTパラメーターを読み取るにはどうすればよいですか?

JSONなどを使用していません。ファイルをアップロードする簡単なフォームがあり、フォームのパラメーターを読み取りたい。以下のコードは期待どおりに機能していません。パラメーターは表示されません。

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("{appNum}/{docId}/file")
public Response uploadDocFile(
        @PathParam("appNum") String appNum,
        @PathParam("docId") String docId,
        @Context HttpServletRequest req)
{

    try {

        log.info("POST Parameters:");

        Enumeration e = req.getParameterNames();

        while(e.hasMoreElements())
        {
            Object key = e.nextElement();
            log.info("Key: " + key);
            log.info("Val: " + req.getParameter(key.toString()));
        }


    }  catch (Exception e) {
        e.printStackTrace();
        return Response.status(Status.INTERNAL_SERVER_ERROR).entity(new StatusResponse(e)).build();
    }

    return Response.ok().build();
}
26
Triton Man

私は同じ問題を抱えています。個々のパラメーターに@FormParam注釈を使用しても機能しますが、@Contextを介して挿入されたHttpServletRequestからそれらを読み取ることはできません。また、Provider<HttpServletRequest>および@RequestParameters<Map<String, String[]>>を使用して、Guiceを介して要求オブジェクト/パラメーターを取得しようとしました。どちらの場合も、投稿パラメーターはありませんでした。

ただし、MultivaluedMap<String, String>パラメーターをリソースメソッドに追加することにより、パラメーターのマップを取得することができます。例:

@POST
public void doSomething(MultivaluedMap<String, String> formParams) {
//...
}
19
Jamol

Jersey RESTful API in Javaを探すことができます Parameter Annotations(@ * Param)

例:

依存:

<dependency>
    <groupId>com.Sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.8</version>
</dependency>

コード:

package yourpack;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

@Path("/path_to_data")
public class DataResource {
    @GET
    @Path("/{param}")
    public Response getMsg(@PathParam("param") String urlparam) {
        int ok = 200;
        String result = "Jersey Data resource: " + urlparam;

        return Response.status(ok).entity(result ).build();
    }
}

注釈のリスト:@ MatrixParam@ HeaderParam@ CookieParam@ FormParam@ QueryParam@ PathParam

5
Veniamin

ある時点で、Jersey ContainerServlet(または要求処理中の他のJerseyオブジェクト)は、「usingInputStream」または「usingReader」をTRUEに設定するrequest.getInputStream()またはrequest.getReader()を呼び出します。この状態により、リクエストオブジェクト内にパラメータマップが入力されなくなります。このようなもの:

parseParameters() {
    if (usingInputStream || usingReader) {
        return; 
    } else {
        parametersMap.putAll({actual parameters parsing from stream})
    }
} 

Map getParametersMap() {
    return parametersMap;
}

アプリケーションの最初のエントリポイント(Jersey ServletContainer.service()メソッドの先頭)にブレークポイントを配置して、request.getParametersMap()呼び出しを評価してください。パラメータを取得します。

2