Другой способ - создать HandlerMethodArgumentResolver
.Это многословно, но вы можете иметь дело со строкой запроса, внедрить ObjectMapper (сохраняя ту же конфигурацию) и выполнить преобразование самостоятельно.
Я создал аннотацию для фильтрации, какой тип я хочу обработать:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface QueryStringArgResolver {
}
Затем создал преобразователь:
@Component
public class QueryStringArgumentResolver implements HandlerMethodArgumentResolver {
...
@Autowired
private ObjectMapper mapper;
@Override
public boolean supportsParameter(final MethodParameter methodParameter) {
return methodParameter.getParameterAnnotation(QueryStringArgResolver.class) != null;
}
@Override
public Object resolveArgument(final MethodParameter methodParameter,
final ModelAndViewContainer modelAndViewContainer,
final NativeWebRequest nativeWebRequest,
final WebDataBinderFactory webDataBinderFactory) throws Exception {
final HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest();
final String json = qs2json(request.getQueryString());
final Object a = mapper.readValue(json, methodParameter.getParameterType());
return a;
}
...
}
Использование:
@ResponseStatus(HttpStatus.OK)
@GetMapping("/some-url")
public SomeResponse doSomething(@QueryStringArgResolver final SomeQueryStringToBind request) {
...
}
Кстати, не забудьте зарегистрировать свой преобразователь таким образом, чтобы можно было вводить компоненты:
@Configuration
public class ArgumentResolverConfig implements WebMvcConfigurer {
@Autowired
private QueryStringArgumentResolver argumentResolver;
@Override
public void addArgumentResolvers(
final List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(argumentResolver);
}
}