Вы можете поместить MultivaluedMap
в качестве параметра в методе ресурса. Это будет тело запроса. JAX-RS поместит все параметры в карту для вас.
@POST
@Consumes("application/x-www-form-urlencoded")
public Response post(@Context UriInfo uriInfo, MultivaluedMap params) {}
ОБНОВЛЕНИЕ (к отредактированному сообщению)
Так что если вы хотите получить параметры в фильтре, вы можете получить тело от ContainerRequestContext
. С Джерси вместо InputStream
с context.getEntityStream()
вы можете привести ContainerRequestContext
к реализации Джерси ContainerRequest
. Это даст вам доступ к методам bufferEntity()
и readEntity()
. Эти методы позволят вам легко получить параметры формы. Вам нужно будет буферизовать сущность, чтобы ее можно было прочитать позже, когда ее нужно будет передать в ваш метод ресурсов.
@Provider
public class MyFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext context) throws IOException {
if (MediaTypes.typeEqual(MediaType.APPLICATION_FORM_URLENCODED_TYPE, context.getMediaType())) { {
return;
}
ContainerRequest request = (ContainerRequest) context;
request.bufferEntity();
Form form = request.readEntity(Form.class);
MultivaluedMap params<String, String> = form.asMap();
MultivaluedMap<String, String> query = context.getUriInfo().getQueryParameters();
}
}
Если вы хотите использовать фильтр только с указанными c методами ресурсов , тогда вы можете использовать Привязка имени или Dynami c Привязка .
Если по какой-то причине readEntity()
возвращает пустую карту (я видел редко появления людей, имеющих эту проблему), вы можете попытаться получить Form
через внутреннее свойство
Object formProperty = request.getProperty(InternalServerProperties.FORM_DECODED_PROPERTY);
if (formProperty != null) {
Form for = (Form) formProperty;
}