|
From: Rohrberg, T. <tim...@vi...> - 2014-05-23 13:39:06
|
Hello everybody,
I am currently trying to use the RESTEasy client framework within an OSGi environment (Eclipse Equinox). To provide the required dependencies, I created a separate Eclipse Plug-In containing the required JAR libraries and exporting the contained packages to downstream bundles. Then, I am using the RESTEasy client framework as follows within my main bundle which includes the before mentioned bundle as required bundle:
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client
.target( "http://192.168.100.181:5952/RXT_RESTWebService-2.1/jobtemplates/Vitaphone 300 BT/386340" );
RxtDevice device = target.request().get( RxtDevice.class );
System.out.println( device.getId() );
Unfortunately, I always get the following error:
javax.ws.rs.client.ResponseProcessingException: javax.ws.rs.ProcessingException: Unable to find a MessageBodyReader of content-type application/xml and type class com.vitasystems.remosxt.rest.client.model.RxtDevice
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.extractResult(ClientInvocation.java:140)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:444)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocationBuilder.get(ClientInvocationBuilder.java:165)
at de.vitasystems.example.resteasy.client.Activator.start(Activator.java:25)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
at java.security.AccessController.doPrivileged(Native Method)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:390)
at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1176)
at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559)
at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544)
at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457)
at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243)
at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438)
at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1)
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
Caused by: javax.ws.rs.ProcessingException: Unable to find a MessageBodyReader of content-type application/xml and type class com.vitasystems.remosxt.rest.client.model.RxtDevice
at org.jboss.resteasy.core.interception.ClientReaderInterceptorContext.throwReaderNotFound(ClientReaderInterceptorContext.java:39)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.getReader(AbstractReaderInterceptorContext.java:73)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:50)
at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.aroundReadFrom(GZIPDecodingInterceptor.java:59)
at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:53)
at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:245)
at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readEntity(ClientResponse.java:179)
at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:211)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.extractResult(ClientInvocation.java:104)
... 18 more
By debugging the included libraries, I tracked the problem down to the following location:
ResteasyProviderFactory.java
protected <T> MessageBodyReader<T> resolveMessageBodyReader(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType, MediaTypeMap<SortedKey<MessageBodyReader>> availableReaders)
{
List<SortedKey<MessageBodyReader>> readers = availableReaders.getPossible(mediaType, type);
//logger.info("******** getMessageBodyReader *******");
for (SortedKey<MessageBodyReader> reader : readers)
{
//logger.info(" matching reader: " + reader.getClass().getName());
if (reader.obj.isReadable(type, genericType, annotations, mediaType))
{
return (MessageBodyReader<T>) reader.obj;
}
}
return null;
}
The problem is a little weired: The readers list of MessageBodyReader instances contains the org.jboss.resteasy.plugins.providers.jaxb.JAXBXmlRootElementProvider, but the reader.obj.isReadable() method returns false for that reader.
In another setup as a plain Maven project outside of the OSGi world, the the referred method reader.obj.isReadable() returns true and the same piece of code works.
I am at the end of my knowledge... Do you guys have any hints?
Best regards,
Timo Rohrberg
________________________________
Hinweis: Diese Email enth?lt evtl. vertrauliche und rechtlich gesch?tzte
Informationen. Sollten Sie nicht der richtige Adressat sein oder diese
Email irrt?mlich erhalten haben, informieren Sie bitte sofort den Absender,
und l?schen Sie anschlie?end diese E-Mail. Das unerlaubte Kopieren sowie
die unbefugte Weitergabe des Inhalts dieser Email sind nicht gestattet.
Attention: This e-mail may contain confidential and/or privileged
information. If you are not the intended recipient or if you have received
this e-mail in error, please notify the sender immediately and delete this
e-mail. Any unauthorized copying, disclosure or distribution of the
contents of this e-mail is strictly prohibited.
|