Как получить параметры формы в фильтре запросов

m пытаюсь получить параметры формы запроса в фильтре запросов:

@Override
public ContainerRequest filter(final ContainerRequest request) {

    final Form formParameters = request.getFormParameters();

    //logic

    return request;
}

Тем не менее, форма всегда кажется пустой.HttpRequestContext.getFormParameters() Документация гласит:

Получить параметры формы объекта запроса.

Этот метод гарантирует, что объект запроса буферизуется так, что он может использоваться приложением.

Возвращает: параметры формы, если есть объект запроса и тип содержимого "применение / х-WWW-форм-urlencoded»в противном случае будет возвращен экземпляр, не содержащий параметров.

Мой ресурс аннотирован@Consumes("application/x-www-form-urlencoded")хотя он победилне были сопоставлены до окончания фильтра запроса - вот почему это нет работает?

Я пытался сделать некоторые исследования, но не могНе могу найти никаких убедительных доказательств того, возможно ли это. Там былоэто 4-летняя дискуссияв которой Пол Сандос говорит:

Если вы работаете в фильтрах Джерси или сHttpRequestContext Вы можете получить параметры формы следующим образом: [неработающая ссылка на Джерси 1.1.1]HttpRequestContext.getFormParameters

Я также нашелэто 3-летняя дискуссия о том, как получить поля формы multipart / form-data в фильтре запросов. В нем Пол Сандос использует следующий код:

// Buffer
InputStream in = request.getEntityInputStream();
if (in.getClass() != ByteArrayInputStream.class) {
    // Buffer input
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        ReaderWriter.writeTo(in, baos);
    } catch (IOException ex) {
        throw new ContainerException(ex);
    }
    in = new ByteArrayInputStream(baos.toByteArray());
    request.setEntityInputStream(in);
}

// Read entity
FormDataMultiPart multiPart = request.getEntity(FormDataMultiPart.class);

Я пытался подражать этому подходу дляForm вместо этого, но результатrequest.getEntityInputStream() всегда пустой поток И глядя наисточникgetFormParametersэтот метод фактически делает то же самое:

@Override
public Form getFormParameters() {
    if (MediaTypes.typeEquals(MediaType.APPLICATION_FORM_URLENCODED_TYPE, getMediaType())) {
        InputStream in = getEntityInputStream();
        if (in.getClass() != ByteArrayInputStream.class) {
            // Buffer input
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            try {
                ReaderWriter.writeTo(in, byteArrayOutputStream);
            } catch (IOException e) {
                throw new IllegalArgumentException(e);
            }

            in = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            setEntityInputStream(in);
        }

        ByteArrayInputStream byteArrayInputStream = (ByteArrayInputStream) in;
        Form f = getEntity(Form.class);
        byteArrayInputStream.reset();
        return f;
    } else {
        return new Form();
    }
}

Я могу'не могу понять, чтоs хлюпает поток ввода сущностей, прежде чем я доберусь до него. Что-то в Джерси должно потреблять это, потому что параметры формы позже передаются в метод ресурса. Что я здесь не так делаю, или это невозможно (и почему)?

РЕДАКТИРОВАТЬ: Вот'Пример отправки запроса:

POST /test/post-stuff HTTP/1.1
Host: local.my.application.com:8443
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

form_param_1=foo&form_param_2=bar

Вот's (несколько избыточно)регистрация запросов:

INFO: 1 * Server in-bound request
1 > POST https://local.my.application.com:8443/test/post-stuff
1 > host: local.my.application.com:8443
1 > connection: keep-alive
1 > content-length: 33
1 > cache-control: no-cache
1 > origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
1 > user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
1 > content-type: application/x-www-form-urlencoded
1 > accept: */*
1 > accept-encoding: gzip,deflate,sdch
1 > accept-language: en-US,en;q=0.8
1 > cookie: [omitted]
1 > 

Вот заголовки ответа на этот запрос, включаяСлед Джерси:

Content-Type →application/json;charset=UTF-8
Date →Fri, 09 Aug 2013 18:00:17 GMT
Location →https://local.my.application.com:8443/test/post-stuff/
Server →Apache-Coyote/1.1
Transfer-Encoding →chunked
X-Jersey-Trace-000 →accept root resource classes: "/post-stuff"
X-Jersey-Trace-001 →match path "/post-stuff" -> "/post\-stuff(/.*)?", [...], "(/.*)?"
X-Jersey-Trace-002 →accept right hand path java.util.regex.Matcher[pattern=/post\-stuff(/.*)? region=0,11 lastmatch=/post-stuff]: "/post-stuff" -> "/post-stuff" : ""
X-Jersey-Trace-003 →accept resource: "post-stuff" -> @Path("/post-stuff") com.application.my.jersey.resource.TestResource@7612e9d2
X-Jersey-Trace-004 →match path "" -> ""
X-Jersey-Trace-005 →accept resource methods: "post-stuff", POST -> com.application.my.jersey.resource.TestResource@7612e9d2
X-Jersey-Trace-006 →matched resource method: public javax.ws.rs.core.Response com.application.my.jersey.resource.TestResource.execute(java.lang.String,java.lang.String)
X-Jersey-Trace-007 →matched message body reader: class com.sun.jersey.api.representation.Form, "application/x-www-form-urlencoded" -> com.sun.jersey.core.impl.provider.entity.FormProvider@b98df1f
X-Jersey-Trace-008 →matched message body writer: java.lang.String@f62, "application/json" -> com.sun.jersey.core.impl.provider.entity.StringProvider@1c5ddffa

Вот (ничем не примечательный) конфиг сервлета:


    jersey
    com.sun.jersey.spi.container.servlet.ServletContainer
    
        com.sun.jersey.config.property.packages
        com.application.my.jersey
    
    
        com.sun.jersey.spi.container.ResourceFilters
        com.application.my.jersey.MyFilterFactory
    
    
        com.sun.jersey.config.feature.Trace
        true
    
    1

Вот'Вот пример ресурса: я

@Path("/post-stuff")
@Produces(MediaType.APPLICATION_JSON)
public final class TestResource {

    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public Response execute(
            @FormParam("form_param_1") final String formParam1,
            @FormParam("form_param_2") final String formParam2
    ) {
        return Response.created(URI.create("/")).entity("{}").build();
    }
}

м с использованием Джерси 1.17.

Для тех, кто заинтересован, яя пытаюсь свернуть мой собственный обязательный параметр проверки, как описано вДЖЕРСИ-351, Мое решениеВот работал для параметров запроса, cookie и заголовка - параметры формы сохраняются на мне.

Ответы на вопрос(2)

Ваш ответ на вопрос