Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jersey-dev] Settting FormDataMultiPart entity stream in ContainerRequestFilter

Hi again,

I think figured it out using MessageBodyWriter<FormDataMultiPart>:

    @Context Providers providers;

    @Override
    public void filter(ContainerRequestContext context) throws IOException
    {
        if (context.getMediaType() != null &&
context.getMediaType().isCompatible(MediaType.MULTIPART_FORM_DATA_TYPE))
        {
            try
            {
                ContainerRequest request = (ContainerRequest)context;
                FormDataMultiPart multiPart =
request.readEntity(FormDataMultiPart.class);
                fixRDFPostMultiPart(multiPart, StandardCharsets.UTF_8);

                MultivaluedMap<String, Object> headers = new
MultivaluedHashMap<>();
                request.getHeaders().entrySet().stream().forEach(entry
-> entry.getValue().forEach(value -> headers.add(entry.getKey(),
value)));
                ByteArrayOutputStream baos =  new ByteArrayOutputStream();

                MessageBodyWriter<FormDataMultiPart> writer =
getProviders().getMessageBodyWriter(FormDataMultiPart.class, null,
null, request.getMediaType());
                writer.writeTo(multiPart, FormDataMultiPart.class,
null, null, request.getMediaType(), headers, baos);

                request.setEntityStream(new
ByteArrayInputStream(baos.toByteArray()));
            }
            catch (ParsingException ex)
            {
                throw new IOException(ex);
            }
        }
    }

On Thu, Oct 28, 2021 at 11:47 AM Martynas Jusevičius
<martynas@xxxxxxxxxxxxx> wrote:
>
> Hi,
>
> I have a ContainerRequestFilter that needs to fix some values in a
> multipart/form-data request body:
>
> public class RDFPostCleanupFilter implements ContainerRequestFilter
> {
>
>     @Override
>     public void filter(ContainerRequestContext context) throws IOException
>     {
>         if (context.getMediaType() != null &&
> context.getMediaType().isCompatible(MediaType.MULTIPART_FORM_DATA_TYPE))
>         {
>             try
>             {
>                 ContainerRequest request = (ContainerRequest)context;
>                 FormDataMultiPart multiPart =
> request.readEntity(FormDataMultiPart.class);
>                 multiPart = fixRDFPostMultiPart(multiPart,
> StandardCharsets.UTF_8);
>                 // request.setEntityStream(???);
>             }
>         }
>     }
>
> }
>
> How do I set the multiPart object with fixed values back onto the
> request context?
> Or how do I turn FormDataMultiPart into an InputStream so that I can
> use request.setEntityStream()? Presumingly via a byte array.
>
>
> Martynas


Back to the top