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)

Reply via email to