Spring Boot десериализации змея дело верблюда дело не удается. Не может десериализовать "some_value" в "someValue" - PullRequest
1 голос
/ 17 марта 2019

Итак, у меня есть приложение Spring Boot, которое должно принять GET-запрос с параметрами "some_value = 1500 & some_other_value = 50000" к объекту с атрибутами someValue и someOtherValue.

Я пробовал @JsonProperty ("some_value"), и это не сработало. Я добавил «spring.jackson.property-naming-Strategy = SNAKE_CASE» в мой файл application.properties, и он все еще не работает.

Важная деталь: когда я пытаюсь сериализовать объект, он поворачивает someValue => some_value и someOtherValue => some_other_value. Так что я знаю, что конфигурация "в порядке", но она отказывается отображать параметр запроса в случае змеи в случае верблюда, который мне нужен. (И нет ... У меня нет контроля над форматом запроса. Я получаю параметры в случае со змеей, и мне нужно отобразить их в случае с верблюдом)

Пожалуйста, помогите. Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

Другой способ - создать 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);
    }
}
0 голосов
/ 17 марта 2019

Сначала параметры вашего запроса (some_value=1500&some_other_value=50000) сопоставляются с RequestParam, а не с RequestBody.Во-вторых, библиотека Джексона десериализует RequestBody, а не RequestParam.В-третьих, параметр преобразования Post или Put метода http в тело.

Итак, вы запрашиваете метод GET и параметры запроса, и ваша конфигурация jackson не работает с параметрами вашего запроса.

Параметр case Camel,или @RequestMapping(name="some_param") String someParam будет сопоставлен с вашим параметром запроса.

0 голосов
/ 17 марта 2019

Значит, @Barath был прав: вы не получаете чистые десериализованные объекты из GET-параметров.Но есть обходной путь.Не уверен, как допустимо это или нет ... но здесь это так:

@Autowired private ObjectMapper objectMapper;

@GetMapping("/users")
    public User users(@RequestParam Map<String,String> params){
        User u = objectMapper.convertValue(params,User.class);
        return u;
    }

Таким образом, у вас все еще есть метод GET, и все параметры десериализуются в симпатичный маленькийобъект для вас, чтобы сделать что угодно.Надеюсь, это кому-нибудь поможет.И я надеюсь, что сотрудники Spring / Jackson включат автоматическую десериализацию параметров GET так же, как это работает с методами POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...