Motivation:

Make it possible to format Collection, @RequestParam arguments to a single String value. On the server side, the ConversionService parses a String value to the target method parameter type. On the client side, the reverse could be done to format the MethodParameter to a String.

See original request and discussion under #33154.

Modifications:

Add customization for handling collection types to RequestParamArgumentResolver

Additional info:

  • I plan to polish the code after checking with the maintainer to make sure I'm working in the direction I intended.
  • If we have a way to format it according to the checkstyle rules, please let me know 🙏

Comment From: doljae

On 95a76ee commit I tried to applying coding style which is used in the project. Please let me know if I need to make any additional changes.

One more thing, I was wondering what your thoughts are on supporting a variety of delimiters besides the comma that @Collectionformat supports.

Comment From: yvasyliev

Hello @rstoyanchev, I need some clarification here.

I've got a case where I need to support different collection encoding methods within the same HTTP Interface:

@HttpExchange("/api/v1")
public interface MyClient {
    @GetExchange("/list")
    String sendList(List<String> params); // must be encoded as `params=value1&params=value2`

    @GetExchange("/csv")
    String sendCsv(List<String> params); // must be encoded as `params=value1,value2`
}

Could you please suggest how can I achieve it after f967f6f?

With Feign client I could do the following:

@FeignClient("myClient")
public interface MyClient {
    @GetMapping("/api/v1/list")
    String sendList(List<String> params); // will be encoded as `params=value1&params=value2`

    @CollectionFormat(feign.CollectionFormat.CSV)
    @GetMapping("/api/v1/csv")
    String sendCsv(List<String> params); // will be encoded as `params=value1,value2`
}

I would expect to see a @CollectionFormat alternative for HTTP Interface to be applied to each request parameter individually. It will provide users with high customization capabilities:

@HttpExchange("/api/v1")
public interface MyAnotherClient {
    @GetExchange("/list")
    String sendDifferentParams(
        List<String> params,
        @CollectionFormat(CSV) List<String> csvParams
    ); // will be encoded as `params=value1&params=value2&csvParams=value1,value2`
}

Comment From: doljae

Hello @yvasyliev . I'm not the one who you mentioned but I received an email from your comment. You can use it with milestone version and please check my issue comment.

As I know, you're right. Currently we can decide only one way of handling collection values with @RequestParam annotation in single declarative HTTP interface.

I'm not the maintainer but I think Spring core already have an ArgumentResolver and it's derived class, we can decide the way to handle collection values with registering customized ArgumentResolver class. @CollectionFormat's implementation is different from the one in spring core and I'm guessing that their intent is to be cautious about adding new annotations. Again, this is just my opinion 🙂