[ 
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)

Reply via email to