@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.
Любые полезные советы будут оценены.
потому что вы хотите это сделать сами, потому что вам нужно использовать аннотацию initbinder, а также создать registerCustomEditor , пользовательский редактор, который расширяет PropertyEditorSupport, а затем преобразовать его туда и привязать в методе initbinder, поэтому ссылка проверки devglan.com/spring-boot/…
Именно так я решил эту проблему, то есть зарегистрировал собственный редактор для преобразования Country.Netherlands в Country.NL и полностью удалил JsonCreator. Спасибо, в любом случае.




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