У меня есть следующая проблема:Пользовательские Enum конвертер быть экземпляр, но не называется
Команда-участник изменил Sensa/Ext, передний конец и посылающий Parmeter с пробелом вместо подчеркивания. Я не знаю фронтального код проекта, а также, и это вызывает следующее сообщение об ошибке:
Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @org.springframework.web.bind.annotation.RequestParam org.company.project.persistence.enums.DocumentTypeEnum for value 'EXPERT OPINION'; nested exception is java.lang.IllegalArgumentException: No enum constant org.company.project.persistence.enums.DocumentTypeEnum.EXPERT OPINION
Я изменил параметр GET запроса с помощью скрипача, и я увидел, что проблема заключается в том, что EXPERT OPINION
вместо EXPERT_OPINION
.
Первоначально я добавил filter
и попытался изменить значение параметра get, но мне пришлось добавить оболочку, так как вы не можете напрямую изменять HTTP-запросы. Однако базовый конвертер, похоже, получает значение parameter
непосредственно из первоначального HTTP-запроса, так что это не удалось.
Затем я решил попробовать сделать заказной конвертер. Я сделал следующий класс, экземпляр при запуске проекта, но он никогда не вызывается для выполнения конкретной конверсии:
@Configuration
public class EnumCustomConversionConfiguration {
@Bean
public ConversionService getConversionService() {
ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
bean.setConverters(getConverters());
bean.afterPropertiesSet();
ConversionService object = bean.getObject();
return object;
}
private Set<Converter> getConverters() {
Set<Converter> converters = new HashSet<Converter>();
converters.add(new StringToEnumConverter(DocumentTypeEnum.class));
return converters;
}
@SuppressWarnings("rawtypes")
private final class StringToEnumConverter<T extends Enum> implements Converter<String, T> {
private final Class<T> enumType;
public StringToEnumConverter(Class<T> enumType) {
this.enumType = enumType;
}
@SuppressWarnings("unchecked")
public T convert(String source) {
checkArg(source);
return (T) Enum.valueOf(enumType, source.trim());
}
private void checkArg(String source) {
// In the spec, null input is not allowed
if (source == null) {
throw new IllegalArgumentException("null source is in allowed");
}
}
}
}
Сначала может быть хорошей идеей добавить свой собственный конвертер в существующие и не заменить их на свой. Откуда вы знаете, что это не называется? Является ли эта конфигурация «объявлена» каким-то образом (т. Е. Знает ли весна об этом)? Вы уверены, что ваш конвертер заменяет пространство '_'? Разве вы не можете попросить парня-парня/парня исправить свой беспорядок? –
См. Также этот вопрос: http://stackoverflow.com/questions/11273443/how-to-configure-spring-conversionservice-with-java-config (это может быть вашей проблемой) –
@RC Я поставил точки останова внутри 'convert 'метод. Вызывается метод org.springframework.core.convert.support.StringToEnum.convert, который является весной по умолчанию ... но не мой, чтобы ввести хак. Я разговаривал с редкими парнями, и оказалось, что мне нужно перестроить внешний код js. Однако это все еще раздражает меня ... почему мой метод преобразования не вызван для определенного типа перечисления? –