The problem was the server response. A server should not return a string, even if correctly encoded, because a string is not a valid JSON object.
http://stackoverflow.com/questions/18419428/what-is-the-minimum-valid-json On Wed, Dec 30, 2015 at 12:06 PM, Sergey Beryozkin <sberyoz...@gmail.com> wrote: > Sorry, I'm getting confused a bit. > If your service method returns String then this String will be written out > to the output stream and this String is expected to be a correct > representation. The default String provider is correct, the class/etc > parameters are not checked in the code because the provider is statically > typed to support String and the runtime guarantees that only String classes > will be provided to it. > > Can you provide more info please. > > By the way, that escape property I mentioned, it is actually set to false > by default, sorry. I have this test: > > @Test > public void testDoNotEscapeForwardSlashes() throws Exception { > JSONProvider<Book> provider = new JSONProvider<Book>(); > ByteArrayOutputStream bos = new ByteArrayOutputStream(); > provider.writeTo(new Book("http://cxf", 123), Book.class, > Book.class, > new Annotation[0], > MediaType.APPLICATION_JSON_TYPE, > new MetadataMap<String, Object>(), bos); > assertTrue(bos.toString().contains("\"name\":\"http://cxf\"")); > } > > and another test where that property is enabled and the forward slashes > being escaped. > > > Sergey > > > On 30/12/15 02:58, Vincenzo D'Amore wrote: > >> And it at last comes out, what was wrong. It was the server response. >> >> Basically a simple json string should not be returned instead of a json >> object. >> >> In other words: >> >> "\/opt\/local\/application\/rest\/" is not a correct JSON object, it is >> only a JSON string and should not be returned as response. >> >> { "path" : "\/opt\/local\/application\/rest\/" } is a valid JSON object >> and >> can be considered a correct answer. >> >> And again, the MessageBodyReader<String> must not decode the string (as it >> does), because it should be the case where the user choose to read without >> any modification and then understand what to do. >> >> Please let me know your opinion. >> >> >> On Wed, Dec 30, 2015 at 2:01 AM, Vincenzo D'Amore <v.dam...@gmail.com> >> wrote: >> >> Update. >>> >>> Looking at CXF internals I discovered that StringTextProvider is used to >>> return the string object. >>> >>> StringTextProvider implements MessageBodyReader<String> and >>> MessageBodyWriter<String>; >>> >>> This is the readFrom implementation (called for MessageBodyReader): >>> >>> public String readFrom(Class<String> type, Type genType, >>> Annotation[] >>> anns, MediaType mt, >>> MultivaluedMap<String, String> headers, >>> InputStream >>> is) throws IOException { >>> >>> return IOUtils.toString(is, HttpUtils.getEncoding(mt, "UTF-8")); >>> >>> } >>> >>> As you can see all the parameter are useless, input stream is returned as >>> is. >>> >>> How can I specify a different provider for strings? >>> >>> >>> On Wed, Dec 30, 2015 at 12:45 AM, Vincenzo D'Amore <v.dam...@gmail.com> >>> wrote: >>> >>> Thanks Sergey, >>>> >>>> but in the meanwhile I tried fruitless different options which include >>>> escapeForwardSlashesAlways(false). >>>> I have also tried to change entirely the implementation, but even Jersey >>>> have the same behaviour. >>>> This is pretty strange to me. >>>> >>>> On Tue, Dec 29, 2015 at 7:10 PM, Sergey Beryozkin <sberyoz...@gmail.com >>>> > >>>> wrote: >>>> >>>> Hi >>>>> >>>>> This is to do with a default CXF JSONProvider which is Jettison based. >>>>> >>>>> Jettison, historically, escapes forward slashes, I don't know why, it >>>>> was there when I started maintaining it. >>>>> What you can do is to configure CXF JSONProvider not to do it, set its >>>>> 'escapeForwardSlashesAlways' to false. >>>>> >>>>> Or use a Jackson provider instead (if you do - Make sure Jettison is on >>>>> on the classpath) >>>>> >>>>> HTH, Sergey >>>>> >>>>> >>>>> >>>>> >>>>> On 29/12/15 14:40, Vincenzo D'Amore wrote: >>>>> >>>>> Hi All, >>>>>> >>>>>> I don't understand why when I receive a json encoded string this is >>>>>> not >>>>>> decoded automatically. >>>>>> I wrote this code: >>>>>> >>>>>> Client client = >>>>>> ClientBuilder.newClient().register(JSONProvider.class); >>>>>> >>>>>> WebTarget target = client.target(" >>>>>> http://example.org/rest/service1 >>>>>> "); >>>>>> target = target.queryParam("method", "method1"); >>>>>> >>>>>> Entity<EndpointRequest> entity = Entity.entity(new >>>>>> EndpointRequest("0000"), >>>>>> MediaType.APPLICATION_JSON); >>>>>> Response response = builder.post(entity); >>>>>> >>>>>> System.out.println( response.getStatus() ); >>>>>> >>>>>> if (response.getStatus() == 200) { >>>>>> >>>>>> // The problem comes here >>>>>> >>>>>> String basePath = response.readEntity(String.class); >>>>>> System.out.println( basePath ); >>>>>> } >>>>>> >>>>>> The request is successfully executed but basePath contains >>>>>> "\/opt\/local\/application\/rest\/" (backslash and double quotes >>>>>> included) >>>>>> >>>>>> basePath should instead contain this: /opt/local/application/rest/ >>>>>> >>>>>> It seems to me, the json deserialization hasn't be triggered when it >>>>>> should. >>>>>> >>>>>> Thanks in advance for your help, >>>>>> Vincenzo >>>>>> >>>>>> >>>>>> >>>>> -- >>>>> Sergey Beryozkin >>>>> >>>>> Talend Community Coders >>>>> http://coders.talend.com/ >>>>> >>>>> >>>> >>>> >>>> -- >>>> Vincenzo D'Amore >>>> email: v.dam...@gmail.com >>>> skype: free.dev >>>> mobile: +39 349 8513251 >>>> >>>> >>> >>> >>> -- >>> Vincenzo D'Amore >>> email: v.dam...@gmail.com >>> skype: free.dev >>> mobile: +39 349 8513251 >>> >>> >> >> >> > > -- > Sergey Beryozkin > > Talend Community Coders > http://coders.talend.com/ > -- Vincenzo D'Amore email: v.dam...@gmail.com skype: free.dev mobile: +39 349 8513251