Great! I'll use this when ServiceMix 4.4.0 is released

Thanks again,
BR
Marcos.

De: Sergey Beryozkin [mailto:[email protected]]
Enviado el: martes, 22 de marzo de 2011 14:31
Para: [email protected]
CC: Marcos Díez Fernández
Asunto: Re: Extracting object from Response when ServerWebApplicationException 
occurs

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 <[email protected]<mailto:[email protected]>>
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:[email protected]<mailto:[email protected]>]
Enviado el: martes, 22 de marzo de 2011 10:51
Para: [email protected]<mailto:[email protected]>
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 
<[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>>
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:[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>]
Enviado el: lunes, 21 de marzo de 2011 19:15
Para: 
[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>
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 
<[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>><mailto:[email protected]<mailto:[email protected]><mailto:[email protected]<mailto:[email protected]>>>>
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.

Reply via email to