[ https://issues.apache.org/jira/browse/CXF-7860?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Colm O hEigeartaigh closed CXF-7860. ------------------------------------ > JAX-RS @FormParam parameters are not updated when form content is modified > -------------------------------------------------------------------------- > > Key: CXF-7860 > URL: https://issues.apache.org/jira/browse/CXF-7860 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Affects Versions: 3.2.6 > Reporter: Andy McCright > Assignee: Andy McCright > Priority: Major > Fix For: 3.2.7, 3.3.0 > > > The JAX-RS community noticed a difference in behavior between CXF and > Jersey/RESTEasy where form data in the HTTP body is modified prior to > invoking the resource method. There are two differences noted: > 1) CXF does not invoke a MessageBodyReader (or any ReaderInterceptors) when > there is no entity parameter. I believe that this is proper behavior - or at > least an appropriate optimization since there is no parameter, why bother > creating one with a MBR (and it's associated ReaderInterceptors)? > 2) When the resource method contains both a Form parameter (entity) _and_ a > parameter annotated with `@FormParam`, and a Filter or interceptor, etc. has > modified the content of of the HTTP body, the value injected for the > `@FormParam` parameter does not reflect those modifications, but the Form > entity parameter does. This seems inconsistent, and (IMO) violates the > spirit of the spec - note that there is no TCK test for this case, so CXF is > still compliant - but it differs from other implementations. Here is an > example: > > > {code:java} > @Provider > public class FormReaderInterceptor implements ReaderInterceptor { > private static final Logger LOG = > LogUtils.getL7dLogger(FormReaderInterceptor.class); > @Override > public Object aroundReadFrom(ReaderInterceptorContext ctx) throws > IOException, WebApplicationException { > BufferedReader br = new BufferedReader(new > InputStreamReader(ctx.getInputStream())); > String line; > while ((line = br.readLine()) != null) { > LOG.info("readLine: " + line); > } > ByteArrayInputStream bais = new > ByteArrayInputStream("value=MODIFIED".getBytes()); > ctx.setInputStream(bais); > return ctx.proceed(); > } > } > {code} > > {code:java} > @POST > public Response processForm(@FormParam("value") String value, Form form) > {... > {code} > > If the HTTP request body contains "value=ORIGINAL", then when CXF invokes the > processForm method, it will pass "ORIGINAL" to the String value, but will > pass a Form object that contains a MultivaluedMap with entry > "value=MODIFIED". To be consistent with Jersey and RESTEasy, CXF should > inject MODIFIED as the String value. > > See JAX-RS API [Issue > 659|https://github.com/eclipse-ee4j/jaxrs-api/issues/659] for more details. > -- This message was sent by Atlassian JIRA (v7.6.3#76005)