[
https://issues.apache.org/jira/browse/CXF-7071?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15542223#comment-15542223
]
Sergey Beryozkin commented on CXF-7071:
---------------------------------------
Neal,
CXF does not implement Servlet API so a statement that 'CXF does not follow
Servlet API' is not correct IMHO.
I see that CXF, in AbstractHttpDestination, wraps
HttpServletRequest.getInputStream() in order to have the option to cache for
one-way or WS-A SOAP related requests - but the caching is not done otherwise
and as I mentioned this code was likely there before we even started doing
JAX-RS.
But note that even if that code was not there CXF would still have to set
InputStream.class on the current message sooner or later before the call
reaches the service, in the vast majority of cases POST requests will have the
input stream non-empty and the runtime can not assume that the service code
will not attempt to read the input stream (directly or indirectly -
deserializing it into some POJO).
But a single HttpServletRequest.getInputStream() call does cache the input
data, you can validate it separately. And as I said CXF can not avoid calling
this method before the POST call reaches the service code.
I think setting a property which I mentioned earlier is not a bad compromise
one can get (you can set it on the bus at the moment a service endpoint is
created, example, set it on serverBean.getBus(true)).
I've just double checked - if you do rely on
HttpServletRequest.getParameter(String name) then you will get a decoded value
only so you will already lose an option to get JAX-RS @Encoded property values
when needed.
Note one other option would be to extend CXF JAX-RS HttpServletRequestFilter
(this is what injected as a JAX-RS context) and override a getParameter method
which will read the parameter from the cached stream. I may consider doing it
later on
> HttpServletRequest.getParameter only get String from query not both posted
> form data
> ------------------------------------------------------------------------------------
>
> Key: CXF-7071
> URL: https://issues.apache.org/jira/browse/CXF-7071
> Project: CXF
> Issue Type: Bug
> Components: JAX-RS
> Affects Versions: 3.1.7
> Reporter: Neal Hu
> Fix For: 3.1.8
>
>
> The http request:
> POST /dubbott-demo-provider/v1.0/users/beanparam HTTP/1.1
> HOST: localhost:8080
> accept: text/plain
> content-type: application/x-www-form-urlencoded
> content-length: 12
> pageIndex=99
> The resource method returns null:
> {code:java}
> public String beanParam(@Context HttpServletRequest req, String ak) {
> String pageIndex = req.getParameter("pageIndex")
> return pageIndex;
> }
> {code}
> From the servlet 3.1 API doc:
> String javax.servlet.ServletRequest.getParameter(String name)
> Returns the value of a request parameter as a String, or null if the
> parameter does not exist. Request parameters are extra information sent with
> the request. For HTTP servlets, parameters are contained in the query string
> or posted form data.
> if we add below servlet filter:
> {code:java}
> public void doFilter(ServletRequest request, ServletResponse response,
> FilterChain chain) throws IOException, ServletException {
> System.out.println(request.getParameter("pageIndex") );
> chain.doFilter(request, response);
> }
> {code}
> The output is "99" the response is the same "99".
> As a conclusion the CXF HttpServletRequest doesn't comply the Servlet 3.1 API
> Spec.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)