Andy McCright created CXF-7860:
----------------------------------
Summary: 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
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)