我得到这样的映射:
@GetMapping(value =“/ topics”,params =“dateRange”)public Set< Integer> getTopicsInRange(@RequestParam DateRange dateRange){ 返回主题服务….
您需要一种方法将DateRange类转换为String,反之亦然。由于您使用的是Spring,因此可以这样做:
的 1)添加转换逻辑 强>
@Data @AllArgsConstructor @NoArgsConstructor public class DateRange { LocalDate begin; LocalDate end; private static final String DELIMITER = "_"; public static DateRange fromFormattedString(String source) { if (source != null) { String[] tokens = source.split(DELIMITER); if (tokens.length == 2) { return new DateRange( LocalDate.parse(tokens[0]), // begin LocalDate.parse(tokens[1]) // end ); } } return null; } public String toFormattedString() { return begin + DELIMITER + end; } }
的 2)创建Spring转换器 强>
import org.springframework.core.convert.converter.Converter; public class DateRangeConverter implements Converter<String, DateRange> { @Override public DateRange convert(String source) { return DateRange.fromFormattedString(source); } }
的 3)注册此转换器 强>
这将允许Spring处理传递的DateRange对象 @RequestParam -s
@RequestParam
@Configuration public class WebApiConfiguration extends WebMvcConfigurationSupport { ... @Override public FormattingConversionService mvcConversionService() { FormattingConversionService f = super.mvcConversionService(); f.addConverter(new DateRangeConverter()); return f; } ... }
最后使用像:
.get(String.format("/topics?dateRange=%s", VALID_DATE_RANGE.toFormattedString())
或(带原始字符串):
.get(String.format("/topics?dateRange=%s", "2018-1-1_2018-2-2")
的 但: 强>
尽管如此,我建议你使用单独的请求参数(开始,结束等),即使有10个,因为它是:
1)RESTful方式
2)防错,因为订单请求参数传入,并不严格。另一方面,将params打包成单个对象将迫使你注意params命令。此外,您必须将所有参数包装在字符串中,因此不允许使用可选的参数,否则可能会破坏拆包逻辑