Hi,

So just a thought.  Why can't this be accomplished today with a
ParamConverter and a custom annotation?

Looking at the samples repo -
https://github.com/javaee-samples/javaee7-samples/blob/master/jaxrs/paramconverter/src/main/java/org/javaee7/jaxrs/paramconverter/MyConverterProvider.java#L18
-
it seems like rawType can be List.class, generic type can be String.class,
and annotation[] containing whatever annotation you want to demarcate that
it should be your customer CSV format.

John

On Sun, Oct 23, 2016 at 6:44 PM Diego Ruotolo <[email protected]>
wrote:

> I have to say that I don't understand your objection (in my defense: here
> is almost 1:00 AM... :-) ), could you please clarify?
>
> Probably the best solution will be to have a kinda
> MultipleParamConverter<T> interface in JAX-RS 2.1 specs defining two
> methods:
> T fromStrings(String[] values);
> String[] toStrings(T value);
>
> The fromStrings() method will build the object used as argument in the
> requested resource method.
> But I'll let people more expert than me discuss on this.
>
> Thanks,
>
> Diego
>
> 2016-10-24 0:30 GMT+02:00 Sergey Beryozkin <[email protected]>:
>
> > I can't agree to this. So a user registering a custom List provider
> breaks
> > the runtime ensuring the service code sees all the multiple values.
> >
> > I can try and work with spec leads on clarifying it for JAX-RS 2.1.
> >
> > Thanks, Sergey
> >
> >
> > On 23/10/16 23:27, Diego Ruotolo wrote:
> >
> >> Hi,
> >>
> >> - when using multiple-value parameters passed in the URI in an HTTP
> >>
> >>> compliant-way (PARAM=V1&PARAM=V2&PARAM=V3), the ParamConverter takes
> only
> >>>> the first value, hence if the ParamConverter builds a list, it will
> be a
> >>>> list of only one value
> >>>>
> >>>>
> >>> Are you saying this loses V2 & V3 ?
> >>>
> >>>
> >> Yes, in this case it loses V2 & V3. AFAIK the only way in Jersey to get
> a
> >> correct parsing of a multiple-valued query parameter is not to write a
> >> custom ParamConverter.
> >>
> >> Cheers,
> >>
> >> Diego
> >>
> >>
> >>
> >> Thanks, Sergey
> >>>
> >>>
> >>> - when not using a custom ParamConverter, the multiple-value parameter
> >>>
> >>>> parsing (the example above) works correctly
> >>>>
> >>>> Therefore what I am trying to achieve (CSV query parameter) can be
> done
> >>>> on
> >>>> Jersey by developing a custom ParamConverter, without explicitly write
> >>>> an
> >>>> Jersey extension, because it is a single value that generates a List
> >>>> that
> >>>> will be passed as a whole as argument of the requested resource
> method.
> >>>>
> >>>> Hope that this clarify,
> >>>>
> >>>> cheers,
> >>>>
> >>>> Diego
> >>>>
> >>>> 2016-10-17 17:37 GMT+02:00 Sergey Beryozkin <[email protected]>:
> >>>>
> >>>> Hi
> >>>>
> >>>>>
> >>>>> In the JAX-RS users thread which I referred to below I did ask about
> >>>>> and
> >>>>> I
> >>>>> don't think I got a +1 from one the spec leads on having
> >>>>> ParamConverterProvider supporting List, please check the archives.
> >>>>> And as I said IMHO the converters should not deal with interpreting
> for
> >>>>> ex
> >>>>> the whole query component value.
> >>>>> But can you investigate please how Jersey handles it ?
> >>>>>
> >>>>> In Pre-match you can figure out if a given CSV value is a multi-value
> >>>>> or
> >>>>> not based on the current request URI (the relative parts), I agree it
> >>>>> will
> >>>>> be less safe compared to the use of annotations
> >>>>>
> >>>>> Cheers, Sergey
> >>>>>
> >>>>>
> >>>>> On 17/10/16 15:56, Diego Ruotolo wrote:
> >>>>>
> >>>>> Hi Sergey,
> >>>>>
> >>>>>>
> >>>>>> I think you are definitively right when you say you don't want to
> >>>>>> introduce
> >>>>>> a CXF specific extension at a standard JAX-RS interface level. But
> >>>>>> taking
> >>>>>> a
> >>>>>> look at the JAX-RS specs it is not specified that ParamConverter
> >>>>>> should
> >>>>>> handle just single values in a collection and not the whole
> >>>>>> collection:
> >>>>>> I
> >>>>>> think that both interpretations are valid, but maybe I am missinig
> >>>>>> something.
> >>>>>>
> >>>>>> Regarding the use of a @PreMatch filter, I don't think it is
> >>>>>> possible: I
> >>>>>> can't read annotations on a method parameter in a @PreMatch filter
> >>>>>> since
> >>>>>> the server resource is not bound yet, and I can't change parameter
> >>>>>> values
> >>>>>> in a post-match filter since it is impossible to change the URI (by
> >>>>>> specs).
> >>>>>> Furthermore, in a post-match filter the server resource is bound but
> >>>>>> not
> >>>>>> yet "filled" with values.
> >>>>>>
> >>>>>> Thanks,
> >>>>>>
> >>>>>> Diego
> >>>>>>
> >>>>>> [email protected]
> >>>>>>
> >>>>>> 2016-10-17 16:28 GMT+02:00 Sergey Beryozkin <[email protected]>:
> >>>>>>
> >>>>>> Hi Diego
> >>>>>>
> >>>>>>
> >>>>>>> But that would introduce a CXF specific extension at a standard
> >>>>>>> JAX-RS
> >>>>>>> interface level. In general I'm quite open to adding new extensions
> >>>>>>> but
> >>>>>>> I'd rather not to in this case...Besides, IMHO, it really should be
> >>>>>>> the
> >>>>>>> job for the JAX-RS runtime, to parse the multivalued query/matrix
> >>>>>>> properties.
> >>>>>>> What you might want to experiment with is to add a prematch request
> >>>>>>> filter
> >>>>>>> which will reset a query string if needed to have List<String>
> >>>>>>> working
> >>>>>>> for
> >>>>>>> either a=1&a=2 or a=1,2, etc
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> Thanks, Sergey
> >>>>>>>
> >>>>>>> On 17/10/16 12:46, Diego Ruotolo wrote:
> >>>>>>>
> >>>>>>> Hi Sergey,
> >>>>>>>
> >>>>>>>
> >>>>>>>> thanks for your answer.
> >>>>>>>> I think a good solution could be to pass the ParamConverter a
> string
> >>>>>>>> containing all the values of a multi-valued query parameter, and
> let
> >>>>>>>> the
> >>>>>>>> user build the collection object.
> >>>>>>>> So, if I have a query string like:
> >>>>>>>> MY_PARAM=VALUE_1&FOO=BAR&MY_PARAM=VALUE_2, the ParamConvert should
> >>>>>>>> receive
> >>>>>>>> the string MY_PARAM=VALUE_1&MY_PARAM=VALUE_2, and the user should
> >>>>>>>> build
> >>>>>>>> the
> >>>>>>>> collection in in the fromString() method. In this way the user can
> >>>>>>>> deal
> >>>>>>>> with both the whole collection and its single values.
> >>>>>>>> I also suggest this behaviour should be activated through a
> property
> >>>>>>>> in
> >>>>>>>> order not to break backward compatibility.
> >>>>>>>> What do you think?
> >>>>>>>>
> >>>>>>>> Thanks,
> >>>>>>>>
> >>>>>>>> Diego
> >>>>>>>>
> >>>>>>>> 2016-10-17 11:47 GMT+02:00 Sergey Beryozkin <[email protected]
> >:
> >>>>>>>>
> >>>>>>>> Hi
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> Thanks for this query, let me redirect to the CXF users list.
> >>>>>>>>>
> >>>>>>>>> FYI, CXF JAX-RS runtime prepares a List itself and only expects
> >>>>>>>>> ParamConverters if any to convert individual values.
> >>>>>>>>>
> >>>>>>>>> I believe RI (Jersey) will also act the same way - but I may be
> >>>>>>>>> wrong
> >>>>>>>>> now.
> >>>>>>>>> You can check a "ParamConverter and Collections" thread on the
> >>>>>>>>> jaxrs
> >>>>>>>>> users
> >>>>>>>>> list. My understanding there was no any agreement reached.
> >>>>>>>>>
> >>>>>>>>> Cheers, Sergey
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> On 16/10/16 23:48, Diego Ruotolo wrote:
> >>>>>>>>>
> >>>>>>>>> Hi everybody,
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> this is my first post to this mailing list.
> >>>>>>>>>> I am using Apache CXF and I have the following problem: I need
> to
> >>>>>>>>>> read a
> >>>>>>>>>> multiple-value query parameter that is written in a
> >>>>>>>>>> comma-separated-values (CSV) format, hence non standard HTTP
> way.
> >>>>>>>>>> I know that this will be fixed in versions 3.1.8 and 3.2.0 with
> >>>>>>>>>> the
> >>>>>>>>>> contextual property "parse.query.value.as.collection", as
> written
> >>>>>>>>>> here:
> >>>>>>>>>> https://issues.apache.org/jira/browse/CXF-6941
> >>>>>>>>>> but the above solution works for ALL query parameters, I want to
> >>>>>>>>>> be
> >>>>>>>>>> selective, for instance I just want query parameters annotated
> >>>>>>>>>> with
> >>>>>>>>>> @MyAnnotation to be parsed as CSV collection, other query
> >>>>>>>>>> parameters
> >>>>>>>>>> may
> >>>>>>>>>> accept commas as a value.
> >>>>>>>>>> Therefore I've written a ParamConverter provided by a
> >>>>>>>>>> ParamConverterProvider: the latter reads the annotation and
> >>>>>>>>>> returns
> >>>>>>>>>> the
> >>>>>>>>>> appriopriate ParamConverter that converts a String into a List.
> >>>>>>>>>> But
> >>>>>>>>>> this
> >>>>>>>>>> is not working since the returned List is used as first element
> of
> >>>>>>>>>> the
> >>>>>>>>>> linked method parameter, so in the end I have a List of List.
> >>>>>>>>>>
> >>>>>>>>>> Example:
> >>>>>>>>>>
> >>>>>>>>>> Query parameter: MY_PARAM=VALUE_1,VALUE_2,VALUE_3
> >>>>>>>>>> Method parameter: List<?> myParam; // Here I put "?" instead of
> >>>>>>>>>> "String"
> >>>>>>>>>> as generic type in order to explain this example
> >>>>>>>>>> ParamConverter fromString() method: return
> >>>>>>>>>> Arrays.asList(value.split(",")); //returns a List<String>
> >>>>>>>>>> Expected result: myParam is a List<String>, a list of 3 elements
> >>>>>>>>>> (VALUE_1, VALUE_2, VALUE_3)
> >>>>>>>>>> Actual result: myParam is a List<List<String>>, a list with one
> >>>>>>>>>> element,
> >>>>>>>>>> this single element is a list of 3 elements (VALUE_1, VALUE_2,
> >>>>>>>>>> VALUE_3)
> >>>>>>>>>>
> >>>>>>>>>> It seems that when used in conjuction with a List (a
> Collection?)
> >>>>>>>>>> method
> >>>>>>>>>> parameter, a ParamConverter works per-element, not for the whole
> >>>>>>>>>> list.
> >>>>>>>>>> Is this the correct behaviour? Do you know some work-around
> that I
> >>>>>>>>>> could
> >>>>>>>>>> use without writing an Apache CXF Interceptor (I don't want to
> be
> >>>>>>>>>> bound
> >>>>>>>>>> to an implementation of JAX-RS) ?
> >>>>>>>>>> I've noticed that Jersey has a similar issue too:
> >>>>>>>>>> https://java.net/jira/browse/JERSEY-2763
> >>>>>>>>>>
> >>>>>>>>>> Thanks in advice,
> >>>>>>>>>>
> >>>>>>>>>> best regards
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>> --
> >>>>>>>>>>
> >>>>>>>>> Sergey Beryozkin
> >>>>>>>>>
> >>>>>>>>> Talend Community Coders
> >>>>>>>>> http://coders.talend.com/
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>
> >>>>>> --
> >>>>> Sergey Beryozkin
> >>>>>
> >>>>> Talend Community Coders
> >>>>> http://coders.talend.com/
> >>>>>
> >>>>>
> >>>>>
> >>>>
> >>> --
> >>> Sergey Beryozkin
> >>>
> >>> Talend Community Coders
> >>> http://coders.talend.com/
> >>>
> >>>
> >>
> >
>

Reply via email to