You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Sergey Beryozkin (JIRA)" <ji...@apache.org> on 2016/02/23 11:53:18 UTC

[jira] [Comment Edited] (CXF-6796) Improve or extend StringTextProvider to write an Object

    [ https://issues.apache.org/jira/browse/CXF-6796?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15158721#comment-15158721 ] 

Sergey Beryozkin edited comment on CXF-6796 at 2/23/16 10:52 AM:
-----------------------------------------------------------------

Hi Jim, 

If we relax StringTextProvider to accept Object then it will start competing with PrimtiveTextProvider which handles Boolean/Number/etc such that a spec requirement (that Boolean/Number/etc are only supported OOB if it is text/plain) will be broken if it is say 'text/html', etc.

For example, suppose we have a client with Accept: texthtml and the method returns Boolean, and  if StringTextProvider accepts object then it will be chosen and return Boolean.

In fact it will convert Order to String even it is Accept: application/json if for some reasons the default Jettison or Jackson won't be able to write it and that would be a problem.

The easiest thing to do is simply to create a custom text/plain MessageBodyWriter that will convert arbitrary objects to String. The other option is to write ContainerResponseFilter which will convert the response body to String and then will reset it on the response container context - so that the service code does not convert to String

Cheers, Sergey  


was (Author: sergey_beryozkin):
Hi Jim, 

If we relax StringTextProvider to accept Object then it will start competing with PrimtiveTextProvider which handles Boolean/Number/etc such that a spec requirement (that Boolean/Number/etc are only supported OOB if it is text/plain) will be broken if it is say 'text/html', etc.

For example, suppose we have a client with Accept: texthtml and the method returns Boolean, and  if StringTextProvider accepts object then it will be chosen and return Boolean.

In fact it will convert Order to String even it is Accept: application/json if for some reasons the default Jettison or Jackson won't be able to write it and that would be a problem.

The easiest thing to do is simply to create a custom text/plain MessageBodyWriter that will convert arbitrary objects to String. The other option is to write ContainerResponseFilter which will convert the response body to String and then will reset it on the response container context - so that the client code does not convert to String

Cheers, Sergey  

> Improve or extend StringTextProvider to write an Object 
> --------------------------------------------------------
>
>                 Key: CXF-6796
>                 URL: https://issues.apache.org/jira/browse/CXF-6796
>             Project: CXF
>          Issue Type: Improvement
>          Components: JAX-RS
>    Affects Versions: 3.1.5
>            Reporter: Jim Ma
>             Fix For: 3.1.6
>
>
> CXF reports it can't find the message writer for  OrderModel class and text/plain content type when the resource class like the following:  
> {code}
> @Produces("text/plain")
> @Path("order/{id}")
> public class OrderResource {
>    @GET
>     public OrderModel get(@PathParam("id") @CustomMax int id) {
>         return new OrderModel(id);
>     }
> }
> {code}
> It is required to change the return Class to String and explicitly invoke toString() return the String value
> {code}. 
> @Produces("text/plain")
> @Path("order/{id}")
> public class OrderResource {
>     @GET
>     public String get(@PathParam("id") @CustomMax int id) {
>         return new OrderModel(id).toString();
>     }
> }
> {code}
> We can improve StringTextProvider to write the Object with toString value to remove the return type must be String class restriction.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)