@JsonCreator не работает для @RequestParams в Spring MVC

@JsonCreator не десериализует @RequestParam типа enum

Я работаю над приложением Spring, где контроллер получает список параметров запроса, которые Spring привязывает к объекту-оболочке. Один из параметров имеет тип enum, где я получаю его по некоторому имени свойства.

Endpoint example: http://localhost:8080/searchCustomers?lastName=Smith&country=Netherlands

@RequestMapping(value = "/search/customers", method = RequestMethod.GET)
public CustomerList searchCustomers(@Valid CustomerSearchCriteria searchCriteria)

public class CustomerSearchCriteria {

    private String lastName;
    private Country country;
}

public enum Country {

    GB("United Kingdom"),
    NL("Netherlands")

    private String countryName;

    Country(String countryName) {
        countryName = countryName;
    }

    @JsonCreator
    public static Country fromCountryName(String countryName) {

        for(Country country : Country.values()) {

            if (country.getCountryName().equalsIgnoreCase(countryName)) {

                return country;
            }
        }
        return null;
    }

    @JsonValue
    public String toCountryName() {

        return countryName;
    } 
}

Я ожидаю, что Spring свяжет enum Country.Netherlands с CustomerSearchCriteria.country, но это не так. Я пробовал аналогичные аннотации с @RequestBody, и это отлично работает, поэтому я предполагаю, что привязка Spring игнорирует @JsonCreator.

Любые полезные советы будут оценены.

Извините за путаницу, тело Json правильно отображается, когда я использую его как @RequestBody, но когда я передаю параметры запроса (например, в упомянутой конечной точке), это когда перечисление не привязывается к CustomerSearchCriteria. Пробовал и страну и название страны

Dev 05.02.2019 10:45

потому что вы хотите это сделать сами, потому что вам нужно использовать аннотацию initbinder, а также создать registerCustomEditor , пользовательский редактор, который расширяет PropertyEditorSupport, а затем преобразовать его туда и привязать в методе initbinder, поэтому ссылка проверки devglan.com/spring-boot/…

Mithat Konuk 05.02.2019 12:53

Именно так я решил эту проблему, то есть зарегистрировал собственный редактор для преобразования Country.Netherlands в Country.NL и полностью удалил JsonCreator. Спасибо, в любом случае.

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

Ответы 1

Вот код, который стоит за комментарием @Mithat Konuk.

Поместите в свой контроллер что-то вроде:

import java.beans.PropertyEditorSupport;

@RestController
public class CountryController {

// your controller methods
// ...

  public class CountryConverter extends PropertyEditorSupport {
    public void setAsText(final String text) throws IllegalArgumentException {
      setValue(Country.fromCountryName(text));
    }
  }

  @InitBinder
  public void initBinder(final WebDataBinder webdataBinder) {
    webdataBinder.registerCustomEditor(Country.class, new CountryConverter());
  }
}

Более подробную информацию можно найти здесь: https://www.devglan.com/spring-boot/enums-as-request-parameters-in-spring-boot-rest.

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