Why because IN CXF 3.1.8 , The Code in the ResponseImpl class is like below
public Object getEntity() {
return InjectionUtils.getEntity(getActualEntity());
}
public Object getActualEntity() {
checkEntityIsClosed();
return lastEntity != null ? lastEntity : entity;
}
private void checkEntityIsClosed() {
if (entityClosed) {
throw new IllegalStateException("Entity is not available");
}
}
public void close() throws ProcessingException {
if (!entityClosed) {
if (!entityBufferred && entity instanceof InputStream) {
try {
((InputStream)entity).close();
} catch (IOException ex) {
throw new ResponseProcessingException(this, ex);
}
}
entity = null;
entityClosed = true;
}
}
In the readEntity method, there is a call to close() method which the
entityClosed variable value is set to true. When calling the getEntity()
method , there is a another method call checkEntityIsClosed is throwing the
exception because the entityClosed is set to true in readEntity.
But In CXF 2.7.7, there is no method call in the getEntity() method ,
simply it returns the entity
public Object getEntity() {
return lastEntity != null ? lastEntity : entity;
}
On Wed, Aug 16, 2017 at 1:58 PM, Sergey Beryozkin [via CXF] <
[email protected]> wrote:
> Hi, that will need to be measured for a concrete flow.
> I'm still not sure why you are seeing the failure with the auto close
> being on - it only takes effect after the entity has been consumed...
>
> Sergey
> On 16/08/17 19:03, sbalustar wrote:
>
> > Hi Sergey,
> >
> > At runtime, in Debug mode Changed the response.stream.auto.close=false.
>
> > Later on , i am not facing the Entity Not available Exception.
> >
> > Is there any impact on the performance when we disabled the flag?
> >
> > On Wed, Aug 16, 2017 at 3:32 AM, Sergey Beryozkin [via CXF] <
> > [hidden email] <http:///user/SendEmail.jtp?type=node&node=5782757&i=0>>
> wrote:
> >
> >> Hi
> >>
> >> I don't quite understand what the issue is, does it happen when you
> >> enable "response.stream.auto.close" ? If yes - what happens if you do
> >> not enable this property ?
> >>
> >> CXF does not auto-close the input stream by default given of the few
> >> well-known side-effects.
> >>
> >> Given you have already tried to debug - it is better to set a
> breakpoint
> >> inside org.apache.cxf.jaxrs.impl.ResponseImpl - there you will see why
> >> InputStream is not available in your case
> >>
> >> Cheers, Sergey
> >>
> >> On 15/08/17 23:20, sbalustar wrote:
> >>
> >>> HI sergey, We are upgrading CXF version 2.7.7 to 3.1.8 and facing the
> >> below
> >>> issue.
> >>>
> >>> AUDIT:2017-08-15 11:31:11.047:localhost-startStop-1:"Caused by
> >>> javax.ws.rs.ProcessingException: java.lang.IllegalStateException:
> >> Entity is
> >>> not available
> >>> at
> >>> org.apache.cxf.jaxrs.client.WebClient.handleResponse(WebClient.java:1141)
>
> >>
> >>> at
> >>> org.apache.cxf.jaxrs.client.WebClient.doResponse(WebClient.java:1110)
>
> >>
> >>> at
> >>> org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1035)
>
> >>
> >>> at
> >>> org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:892)
>
> >>
> >>> at
> >>> org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:863)
>
> >>
> >>> at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:413)
>
> >>
> >>> at
> >>> com.walmart.platform.soa.client.RestClient.invoke(RestClient.java:261)
>
> >>> ... 78 more
> >>>
> >>> I have gone through this ticket
> >>> https://issues.apache.org/jira/browse/CXF-5144 which you mentioned
> that
> >> Set
> >>> this property: "response.stream.auto.close" to true. This is done even
> >>> though we are getting the same issue.
> >>>
> >>> When i debug the code, in WebClient.invoke method this exception is
> >> occured.
> >>>
> >>> protected Response handleResponse(Message outMessage, Class<?>
> >>> responseClass, Type genericType) {
> >>> try {
> >>> ResponseBuilder rb = setResponseBuilder(outMessage,
> >>> outMessage.getExchange());
> >>> Response currentResponse = rb.clone().build();
> >>> ((ResponseImpl)currentResponse).setOutMessage(outMessage);
>
> >>>
> >>> Object entity = readBody(currentResponse, outMessage,
> >>> responseClass, genericType,
> >>> new Annotation[]{});
> >>>
> >>> if (entity == null) {
> >>> int status = currentResponse.getStatus();
> >>> if (status >= 400) {
> >>> entity = currentResponse.getEntity();
> >>> }
> >>> }
> >>> rb = JAXRSUtils.fromResponse(currentResponse);
> >>>
> >>> rb.entity(entity instanceof Response
> >>> ? ((Response)entity).getEntity() : entity);
> >>>
> >>> Response r = rb.build();
> >>> getState().setResponse(r);
> >>> ((ResponseImpl)r).setOutMessage(outMessage);
> >>> return r;
> >>> } catch (Throwable ex) {
> >>> throw (ex instanceof ProcessingException) ?
> >>> (ProcessingException)ex
> >>> : new
> >>> ProcessingException(ex);
> >>> } finally {
> >>>
> >>> ClientProviderFactory.getInstance(outMessage).clearThreadLocalProxies();
>
> >>
> >>> }
> >>> }
> >>>
> >>>
> >>> public static ResponseBuilder fromResponse(Response response) {
> >>> ResponseBuilder rb = toResponseBuilder(response.getStatus());
>
> >>> * rb.entity(response.getEntity());
> >>> * for (Map.Entry<String, List<Object>> entry :
> >>> response.getMetadata().entrySet()) {
> >>> List values = entry.getValue();
> >>> for (Object value : values) {
> >>> rb.header(entry.getKey(), value);
> >>> }
> >>> }
> >>> return rb;
> >>> }
> >>>
> >>> * rb.entity(response.getEntity());
> >>> * seems like , entity is null in ResponseBuilder rb from the
> >> fromResponse
> >>> method.
> >>>
> >>> Please let me know, what could be the solution to fix this issue?
> >>>
> >>>
> >>>
> >>> --
> >>> View this message in context: http://cxf.547215.n5.nabble.
> >> com/Closing-of-WebClient-and-Response-objects-tp5748134p5782716.html
> >>> Sent from the cxf-user mailing list archive at Nabble.com.
> >>>
> >>
> >>
> >> --
> >> Sergey Beryozkin
> >>
> >> Talend Community Coders
> >> http://coders.talend.com/
> >>
> >>
> >> ------------------------------
> >> If you reply to this email, your message will be added to the
> discussion
> >> below:
> >> http://cxf.547215.n5.nabble.com/Closing-of-WebClient-and-
> Response-objects-
> >> tp5748134p5782725.html
> >> To unsubscribe from Closing of WebClient and Response objects, click
> here
> >> <
> >> .
> >> NAML
> >> <http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?
> macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&
> base=nabble.naml.namespaces.BasicNamespace-nabble.view.
> web.template.NabbleNamespace-nabble.view.web.template.
> NodeNamespace&breadcrumbs=notify_subscribers%21nabble%
> 3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_
> instant_email%21nabble%3Aemail.naml>
> >>
> >
> >
> >
> >
> > --
> > View this message in context: http://cxf.547215.n5.nabble.
> com/Closing-of-WebClient-and-Response-objects-tp5748134p5782748.html
> > Sent from the cxf-user mailing list archive at Nabble.com.
> >
>
>
> ------------------------------
> If you reply to this email, your message will be added to the discussion
> below:
> http://cxf.547215.n5.nabble.com/Closing-of-WebClient-and-Response-objects-
> tp5748134p5782757.html
> To unsubscribe from Closing of WebClient and Response objects, click here
> <http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5748134&code=YnN1ZGFiYXRodWxhQGdtYWlsLmNvbXw1NzQ4MTM0fDEyODI4MTYwNTM=>
> .
> NAML
> <http://cxf.547215.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>
--
View this message in context:
http://cxf.547215.n5.nabble.com/Closing-of-WebClient-and-Response-objects-tp5748134p5782758.html
Sent from the cxf-user mailing list archive at Nabble.com.