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 <[email protected]>
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 <[email protected]>
> 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: [email protected]
> skype: free.dev
> mobile: +39 349 8513251
>
--
Vincenzo D'Amore
email: [email protected]
skype: free.dev
mobile: +39 349 8513251