這是一種閱讀表單實體而不依賴實現特定類的方法,即它可以與Jersey(v2)或CXF(v3)一起使用。
@Provider
public class AFilter implements ContainerRequestFilter {
@Context
private Providers providers;
@Override
public void filter(ContainerRequestContext request) throws IOException {
if (!request.hasEntity() || !MediaTypes.typeEqual(APPLICATION_FORM_URLENCODED_TYPE, request.getMediaType())) {
// if not a form ...
return;
}
ByteArrayInputStream resettableIS = toResettableStream(request.getEntityStream());
Form form = providers.getMessageBodyReader(Form.class, Form.class, new Annotation[0], APPLICATION_FORM_URLENCODED_TYPE)
.readFrom(Form.class, Form.class, new Annotation[0], APPLICATION_FORM_URLENCODED_TYPE, null, resettableIS);
// do something with Form
resettableIS.reset();
request.setEntityStream(resettableIS);
}
@Nonnull
private ByteArrayInputStream toResettableStream(InputStream entityStream) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = entityStream.read(buffer)) > -1) {
baos.write(buffer, 0, len);
}
baos.flush();
return new ByteArrayInputStream(baos.toByteArray());
}
}
這樣做效果很好,並且具有僅使用JAX-RS API的好處,因此具有便攜性。
但請注意,CXF 2.x使用尚未具有Form
類的JAX-RS API 2.0-m10。在這種情況下,人們可以簡單地用MultivaluedMap.class
代替Form.class
,這是以一些未檢查/原始類型警告的價格。
應該被接受的答案:) – user1046143 2015-02-25 08:48:28
請注意'ContainerRequest'是一個Jersey類,不屬於JAX-RS標準的一部分。不幸的是,根據https://java.net/jira/browse/JERSEY-2664,僅憑JAX-RS是不可能的。 – Zero3 2015-12-15 18:26:38