2016-09-13 1 views
0

У меня есть следующая проблема:Пользовательские 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"); 
      } 
     } 
    } 

} 
+1

Сначала может быть хорошей идеей добавить свой собственный конвертер в существующие и не заменить их на свой. Откуда вы знаете, что это не называется? Является ли эта конфигурация «объявлена» каким-то образом (т. Е. Знает ли весна об этом)? Вы уверены, что ваш конвертер заменяет пространство '_'? Разве вы не можете попросить парня-парня/парня исправить свой беспорядок? –

+1

См. Также этот вопрос: http://stackoverflow.com/questions/11273443/how-to-configure-spring-conversionservice-with-java-config (это может быть вашей проблемой) –

+0

@RC Я поставил точки останова внутри 'convert 'метод. Вызывается метод org.springframework.core.convert.support.StringToEnum.convert, который является весной по умолчанию ... но не мой, чтобы ввести хак. Я разговаривал с редкими парнями, и оказалось, что мне нужно перестроить внешний код js. Однако это все еще раздражает меня ... почему мой метод преобразования не вызван для определенного типа перечисления? –

ответ

0

ли вы добавить его в конфигурацию Spring MVC?

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = { "..." }) 
public class ApplicationConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void addFormatters(FormatterRegistry formatterRegistry) { 
     formatterRegistry.addConverter(getMyConverter()); 
    } 

... 

 Смежные вопросы

  • Нет связанных вопросов^_^