cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From eanbiso <bisoma...@hotmail.it>
Subject RE: java.lang.ClassCastException: [B cannot be cast to [Ljava.lang.Object
Date Thu, 04 Jul 2013 15:23:09 GMT
Hi Sergey,
I'm using CXF_2.7.3.
With your help I've found the solution using this BodyReader added clientSide:

@Provider
public class StringArrayBodyReader implements MessageBodyReader<Object> {
     
        private static ObjectMapper jsonMapper = new ObjectMapper();

        @Override
        public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2,
                MediaType arg3) {
            return String[].class.isAssignableFrom(arg0);
        }

        @Override
        public String[] readFrom(Class<Object> arg0, Type arg1,
                Annotation[] arg2, MediaType arg3,
                MultivaluedMap<String, String> arg4, InputStream arg5)
                throws IOException, WebApplicationException {
            // get the content as a string
            String toSplit = streamToString(arg5);
            String[] splitted = null;
            if(toSplit!=null){
                // try to split the String in a String[]
                splitted = jsonMapper.readValue(toSplit, String[].class);
            }else{
                log.error("Failure splitting the content into a String[]");
            }
            return splitted;
        }
        
        private String streamToString(InputStream in) throws IOException {
            try{
                StringBuilder out = new StringBuilder();
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
                for(String line = br.readLine(); line != null; line = br.readLine()) 
                    out.append(line);
                br.close();
                return out.toString();
            }catch(Exception e){
                log.error("Failure getting the String corresponding to the InputStream",e);
                return null;
            }
        }
}

Now it works good!! Thanks a lot!
I've a latest question for you:
if from the server I return a String[] with "normal" Strings, the String arrive properly formatted
to the BodyReader; if from the server I return "special" Strings, like °C, in the BodyReader
the String arrives modified: °C
I can add a cleaning of the Strings in the BodyReader at client side but I prefer to return
always a cleaned String from the Server: do you know if I can add some encoding at the endPoints
publication, or  if it is better to add an interceptor server side performing the cleaning,
or something else?
Thanks,

Andrea

Date: Thu, 4 Jul 2013 06:31:24 -0700
From: ml-node+s547215n5730306h6@n5.nabble.com
To: bisomagic@hotmail.it
Subject: Re: java.lang.ClassCastException: [B cannot be cast to [Ljava.lang.Object



	Hi, can you temp make that provider typed on Object, or if it is CXF 

2.7.5, set "org.apache.cxf.jaxrs.providers.ignore.typevars" to true ?


It is a bug: the runtime does not currently deal at all with 

GenericArrayType


I'll be fixing it shortly

Many thanks, Sergey


On 04/07/13 12:44, eanbiso wrote:

> Hi Sergey,

> unfortunately the StringArrayBodyReader is the only one provider I've added loading the
endPoint at client side.

> If it can be useful I do a quick recap of the situation.

> - Using swagger u.i that expects a json format the response body is:

>      ["°C"]

> and no problem occurs

> - This is the reponse I see from web browser when I call the REST web method http://*****/DMConfigRest/getUnitsOfMeasure/0/12/0/10/0:
>      ["°C"]

> (there is an unexpected char: Â, but no problem occurs at the invocation)

> - Calling from java code the "No message body reader..." exception occurs client side.

> - In all the cases no exception occurs server side.

> - The annotations I've used to tag the ws interface are these:

>

> @WebService(targetNamespace = JettyConstants.DMConfigNameSpace)

> @Api(value = "/DMConfigRest", description = "Operations about DataModelConfigurator service,
used from all the actors which want to edit the XML configuration file used by WSNDataModel")

> @Produces({"application/json"})

> public interface IDataModelConfig extends IPublishable { ...

>

>

>      @GET

>      @Path("/getUnitsOfMeasure/{appGardenID}/{protType}/{profileID}/{objectIDhigh}/{objectIDlow}")

>      @ApiOperation(value = "Tells you what are the units of measure for the object.",

>                      notes = "Returns the unit of measure of the current object.", response
= String.class, produces="application/xml,application/json")

>      public String[] getUnitsOfMeasure(

>              @ApiParam(value = "appGardenID", required = true) @WebParam(name = "appGardenID")
@PathParam("appGardenID") @CxfWSAuthGrain(type=authType.appGarden) int appGardenID,

>              @ApiParam(value = "protType", required = true) @WebParam(name = "protType")
@PathParam("protType") short protType,

>              @ApiParam(value = "profileID", required = true) @WebParam(name = "profileID")
@PathParam("profileID") int profileID,

>              @ApiParam(value = "objectIDhigh", required = true) @WebParam(name = "objectIDhigh")
@PathParam("objectIDhigh") int objectIDhigh,

>              @ApiParam(value = "objectIDlow", required = true) @WebParam(name = "objectIDlow")
@PathParam("objectIDlow") int objectIDlow) throws InstantiationException;

>

> ....

> }

>

> - Now I've added the body reader at client side but I'm not able to arrive in its readFrom
method.

>

>

> Thanks,

> Andrea

>

> Date: Thu, 4 Jul 2013 03:23:44 -0700

> From: [hidden email]

> To: [hidden email]

> Subject: Re: java.lang.ClassCastException: [B cannot be cast to [Ljava.lang.Object

>

>

>

> 	

> Hi Andrea,

>

>

> Re your earlier email: no problems about the questions, please keep them

>

> coming,

>

>

> Re this issue: do you have other providers registered ? Other than that,

>

> I can't think of why readFrom is not called

>

>

> Thanks, Sergey

>

>

> On 04/07/13 11:15, eanbiso wrote:

>

>> Hi Sergey,

>

>> I've tried this solution: I've add a BodyReader at clientSide to manage the

>

>> response from the server.

>

>> I've added this provider:

>

>>

>

>> @Provider

>

>> public class StringArrayBodyReader implements MessageBodyReader<String[]> {

>

>> 	

>

>> 		private static final Plat1Logger log = new

>

>> Plat1Logger(StringArrayBodyReader.class);

>

>>

>

>> 		@Override

>

>> 		public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2,

>

>> 				MediaType arg3) {

>

>> 			return String[].class.isAssignableFrom(arg0);

>

>> 		}

>

>>

>

>> 		@Override

>

>> 		public String[] readFrom(Class<String[]> arg0, Type arg1,

>

>> 				Annotation[] arg2, MediaType arg3,

>

>> 				MultivaluedMap<String, String> arg4, InputStream arg5)

>

>> 				throws IOException, WebApplicationException {

>

>> 			// TODO Auto-generated method stub

>

>> 			return null;

>

>> 		}

>

>> }

>

>>

>

>> at the loading of the REST endPoints:

>

>>

>

>> 		JAXRSClientFactoryBean proxyFactory = new JAXRSClientFactoryBean();

>

>> 		proxyFactory.setServiceClass(clazz);

>

>> 		proxyFactory.setAddress(address);

>

>> 		proxyFactory.setProvider(new StringArrayBodyReader());

>

>>

>

>> by the client application.

>

>> Debugging I've seen that when I call a REST web method from the client I

>

>> arrive in the isReadable method of the provider and it returns true only if

>

>> the return type is a String[].... but I' m not yet able to arrive in the

>

>> readFrom method of the provider (this even if the isReadable has returned a

>

>> true value).

>

>> Do you know why this happens?

>

>> And how can I fix it and force to call the readFrom method when isReadable

>

>> returns true?

>

>> In this way I hope to solve the problem.

>

>> Thanks a lot,

>

>>

>

>> Andrea

>

>>

>

>>

>

>>

>

>>

>

>>

>

>>

>

>> --

>

>> View this message in context: http://cxf.547215.n5.nabble.com/java-lang-ClassCastException-B-cannot-be-cast-to-Ljava-lang-Object-tp5730141p5730271.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/java-lang-ClassCastException-B-cannot-be-cast-to-Ljava-lang-Object-tp5730141p5730306.html
	
	
		
		To unsubscribe from java.lang.ClassCastException: [B cannot be cast to [Ljava.lang.Object,
click here.

		NAML
	 		 	   		  



--
View this message in context: http://cxf.547215.n5.nabble.com/java-lang-ClassCastException-B-cannot-be-cast-to-Ljava-lang-Object-tp5730141p5730309.html
Sent from the cxf-user mailing list archive at Nabble.com.

Mime
View raw message