cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: Extracting object from Response when ServerWebApplicationException occurs
Date Tue, 22 Mar 2011 13:31:11 GMT
Hi Marcos

I think I've got it fixed now, this issue has proved to be quite
time-consuming :-), though I thought it would take me 30 mins or so to fix
it :-)

I moved the code for reading the error stream from ResponseBuilder to
ServerWebApplicationException, so in 2.3.4 you can do:

catch (ServerWebApplicationException ex) {
     Error error = ex.toErrorObject(client, Error.class);
}

thanks, Sergey

2011/3/22 Marcos Díez Fernández <mdiez@tecsisa.com>

> Hi Sergey
>
> As you said, it works perfectly using WebClient. The entity is correctly
> unmarshalled to the object I need.
> However, I have a LOT of proxy calls, and changing all of them to use
> WebClient would mean finding all the necessary paths to configure the
> client... So I think I'll go with the errorMessage-unmarshalling approach
> for the moment and when the problem is fixed I'll change to
> entity-unmarshalling.
>
> Thanks for your help and interest,
> BR,
> Marcos.
>
> De: Sergey Beryozkin [mailto:sberyozkin@gmail.com]
> Enviado el: martes, 22 de marzo de 2011 10:51
> Para: users@cxf.apache.org
> CC: Marcos Díez Fernández
> Asunto: Re: Extracting object from Response when
> ServerWebApplicationException occurs
>
> Hi Marcos
>
> OK - I see where the problem is now. My test uses WebClient and you use the
> proxy, there's a slightly different code path there, thanks for finding the
> cause of the problem - will get it fixed soon, at the moment you can try
> using WebClient and that should work...
>
> Sergey
> 2011/3/22 Marcos Díez Fernández <mdiez@tecsisa.com<mailto:
> mdiez@tecsisa.com>>
> Hi Sergey,
>
> That code is the one that works, unmarshalling from the errorMessage I
> don't get the exception mentioned before.
> This exception is produced when trying to read from the entity, without
> calling getMessage, doing this:
>
>               ErrorDetail errorDetail = (ErrorDetail)
> jsonProvider.readFrom(
>                                               (Class)ErrorDetail.class,
>                                               (Class)ErrorDetail.class,
>                                               new Annotation[]{},
>
> MediaType.APPLICATION_JSON_TYPE,
>                                               metadataMap,
>
> (InputStream)response.getEntity());
>
> When I first catch the ServerWebApplicationException, I can see that the
> errorMessage has already been initialized.
> So if ServerWebApplicationException.getMessage() is called, it won't call
> readErrorMessage():
>
>   public String getMessage() {
>       if (errorMessage == null) {
>           errorMessage = readErrorMessage();
>       }
>       return errorMessage;
>   }
>
> Debugging this method I can see this stack the first time getMessage it's
> called:
>
>               ServerWebApplicationException.getMessage() line: 71
>               ServerWebApplicationException.toString() line: 107
>               Fault(Throwable).<init>(Throwable) line: 242
>               Fault(Exception).<init>(Throwable) line: 77
>               Fault(RuntimeException).<init>(Throwable) line: 77
>               Fault(UncheckedException).<init>(Throwable) line: 43
>               Fault.<init>(Throwable) line: 77
>               ClientProxyImpl.checkResponse(Method, Response, Message)
> line: 243
>               ClientProxyImpl.handleResponse(HttpURLConnection, Message,
> OperationResourceInfo) line: 453
>               ClientProxyImpl.doChainedInvocation(URI,
> MultivaluedMap<String,String>, OperationResourceInfo, Object[], int,
> MultivaluedMap<ParameterType,Parameter>, List<Object>) line: 445
>               ClientProxyImpl.invoke(Object, Method, Object[]) line: 177
>               $Proxy20.getLiquidaciones(Solicitar) line: not available
>               LiquidacionesServiceClient.getLiquidaciones(String, int)
> line: 75
>
> LiquidacionesServiceClientErrorTest.testErrorLiquidacionesSolicitarVersionZero()
> line: 63
>               NativeMethodAccessorImpl.invoke0(Method, Object, Object[])
> line: not available [native method]
>               NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
>               DelegatingMethodAccessorImpl.invoke(Object, Object[]) line:
> 25
>               Method.invoke(Object, Object...) line: 597
>               TestMethod.invoke(Object) line: 59
>               MethodRoadie.runTestMethod() line: 98
>               MethodRoadie$2.run() line: 79
>               MethodRoadie.runBeforesThenTestThenAfters(Runnable) line: 87
>               MethodRoadie.runTest() line: 77
>               MethodRoadie.run() line: 42
>               JUnit4ClassRunner.invokeTestMethod(Method, RunNotifier) line:
> 88
>               JUnit4ClassRunner.runMethods(RunNotifier) line: 51
>               JUnit4ClassRunner$1.run() line: 44
>               ClassRoadie.runUnprotected() line: 27
>               ClassRoadie.runProtected() line: 37
>               JUnit4ClassRunner.run(RunNotifier) line: 42
>
> JUnit4TestMethodReference(JUnit4TestReference).run(TestExecution) line: 49
>               TestExecution.run(ITestReference[]) line: 38
>               RemoteTestRunner.runTests(String[], String, TestExecution)
> line: 467
>               RemoteTestRunner.runTests(TestExecution) line: 683
>               RemoteTestRunner.run() line: 390
>               RemoteTestRunner.main(String[]) line: 197
>
> So does this mean that when I catch the ServerWebApplicationException the
> stream has already been consumed, and therefore I can't obtain the
> unmarshalled object from it?
>
> Thanks,
> Marcos.
>
> De: Sergey Beryozkin [mailto:sberyozkin@gmail.com<mailto:
> sberyozkin@gmail.com>]
> Enviado el: lunes, 21 de marzo de 2011 19:15
> Para: users@cxf.apache.org<mailto:users@cxf.apache.org>
> CC: Marcos Díez Fernández
> Asunto: Re: Extracting object from Response when
> ServerWebApplicationException occurs
>
> Hi Marcos
> 2011/3/21 Marcos Díez Fernández <mdiez@tecsisa.com<mailto:
> mdiez@tecsisa.com><mailto:mdiez@tecsisa.com<mailto:mdiez@tecsisa.com>>>
> Hi Sergey,
>
> I don't use ServerWebApplicationException.getMessage() and still get that
> exception.
>
> Don't know what else I could try, so I think I'll go with the errorMessage
> unmarshalling, although it may not be the most 'proper/correct' way...
>
> This is the code fragment from your earlier message:
>
>  InputStream is = new ByteArrayInputStream(e.
> getMessage().getBytes("UTF-8"));
>
>      ErrorDetail errorDetail = (ErrorDetail) jsonProvider.readFrom(
>                                              (Class)ErrorDetail.class,
>                                              (Class)ErrorDetail.class,
>                                              new Annotation[]{},
>
>  MediaType.APPLICATION_JSON_TYPE,
>                                              metadataMap,
>                                              is);
>
> I can also see that e.getMessage(), in case of
> ServerWebApppicationException, internally reads from response.getEntity(),
> you can check the source :-). Somewhere the stream is consumed, can you
> double check where it might be happening ? I have the test on mainline where
> ResponseReader is used to do the same...
>
> thanks, Sergey
>
> Thanks a lot for your help
> BR,
> Marcos.
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message