Сопоставление полей модели Spring @ModelAttribute

Я переписываю старую службу REST, написанную на собственном фреймворке, для использования Spring. У меня есть контроллер с методом POST, который принимает параметр либо как POST, либо как тело x-www-form-urlencoded. После нескольких ответов StackOverflow я использовал аннотацию @ModelAttribute и создал модель.

Моя проблема в том, что старый REST API использует имя свойства в случае змейки - скажем, some_property. Я хочу, чтобы мой код Java соответствовал соглашениям об именах Java, поэтому в моей модели поле называется someProperty. Я пробовал использовать аннотацию @JsonProperty, как и в своих объектах DTO, но на этот раз это не сработало. Мне удалось заставить код работать, только если поле в модели было названо some_property. Вот мой пример кода:

import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping("/my/api/root")
public class SomethingController {

    @PostMapping("/my/api/suffix")
    public Mono<Object> getSomething(
            @RequestParam(name = "some_property", required = false) String someProperty,
            @ModelAttribute("some_property") Model somePropertyModel) {
        // calling my service here
    }

    public class Model {
        @JsonProperty("some_property")
        private String someProperty;

        private String some_property;
        // Getters and setters here
    }
}

Я ищу аннотацию или любой другой элегантный способ сохранить стиль именования Java в коде, но использую унаследованное имя свойства из REST API.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
2 054
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Аннотация @JsonProperty может работать только с форматом JSON, но вы используете x-www-form-urlencoded.

Если вы не можете изменить свой тип POST, вам нужно написать свой собственный Jackson ObjectMapper:

@JsonProperty не работает для Content-Type: application / x-www-form-urlencoded

Я принимаю этот ответ, поскольку он привел меня к ответу на мой вопрос - нет элегантного способа добиться того, чего я хочу. Я не собираюсь писать тонны кода в эстетических целях. На данный момент нет подходящей аннотации (см. Проблему Spring Jira: jira.spring.io/browse/SPR-13433). Один из ответов на поставленный вами вопрос (не принятый) дайте статье, в которой показано несколько альтернативных подходов к решению этой проблемы. Вот ссылка: afitnerd.com/2017/05/24/…

ShaMan-H_Fel 24.04.2018 09:33

@ ShaMan-H_Fel Хорошо, спасибо за отзыв, TIL.

Bennett Dams 24.04.2018 13:51

Я тоже встречал похожий случай с вами, Пожалуйста, замените @ModelAttribute("some_property") на @RequestBody.

Надеюсь помочь вам!

Другие вопросы по теме