2017-01-15 6 views
0
контекста приложения

В моей applicationContext.xml я объявляю следующие 2 пользовательских преобразователь,SpringMVC Пользовательский конвертер не найден, но объявлен в XML

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <set> 
      <bean class="util.BooleanToYesNoDataTypeConverter"/> 
      <bean class="util.YesNoDataTypeToBooleanConverter"/> 
     </set> 
    </property> 
</bean> 

преобразователи заботиться о преобразовании между булевым и пользовательским типом под названием «YesNoDataType ',

public class BooleanToYesNoDataTypeConverter implements Converter<Boolean,YesNoDataType> { 

    @Override 
    public YesNoDataType convert(Boolean source) { 

     if (Boolean.TRUE.equals(source)) 
      return YesNoDataType.Y_YES; 
     else 
      return YesNoDataType.N_NO; 

    } 

} 

public class YesNoDataTypeToBooleanConverter implements Converter<YesNoDataType,Boolean> { 

    @Override 
    public Boolean convert(YesNoDataType source) { 

     if (YesNoDataType.Y_YES.equals(source)) 
      return Boolean.TRUE; 
     else 
      return Boolean.FALSE; 

    } 

} 

В теории преобразователи теперь зарегистрированы и могут быть использованы, верно? Я следую примеру в этом сообщении: Spring MVC type conversion : PropertyEditor or Converter?

Однако в моем контроллере, когда я перехожу к следующему переопределению initBinder, я проверяю текущие активные преобразователи. Угадайте, что, мои 2 конвертера недоступны. Почему это? Взгляните ниже.

@Override 
    @InitBinder 
    public void initBinder(WebDataBinder binder) { 

     // Check current ConversionService 
     ConversionService conversionService = binder.getConversionService(); 
     // The below FAILS with a "Converter not found" error 
     Boolean b = conversionService.convert(YesNoDataType.Y_YES, Boolean.class); 
     // These 2 return FALSE, meaning we CAN'T convert YesNoDataType/Boolean 
     System.out.println("Can convert YesNo -> Boolean? " + conversionService.canConvert(Boolean.class, YesNoDataType.class)); 
     System.out.println("Can convert Boolean -> YesNo? " + conversionService.canConvert(YesNoDataType.class, Boolean.class)); 

    } 

Кстати, позвольте мне задать более широкий вопрос о Spring/SpringMVC. Весенние люди ликвидировали/закрыли форум, который существовал до 2014 года, http://forum.spring.io/. Единственный способ получить поддержку SpringMVC - это опубликовать здесь, в StackOverflow, но любые темы SpringMVC здесь получают 5-6 просмотров и ответов. Несколько лет назад сообщество было активным. Что случилось с SpringMVC, это уже не поддерживается? Где сообщество для этого? Просто интересуюсь.

+0

Вы используете maven? если вы попробовали очистить свой проект и построить еще раз? иногда он становится глючным, стоит сделать снимок: P – Boldbayar

+0

также проверьте, есть ли у ваших преобразователей @Component – Boldbayar

+0

Да, я добавил @Component к конвертерам. Еще один результат. –

ответ

0

Как и в случае с FYI, единственное, что работает в моем контроллере, - это отличить ConversionService от GenericConversionService, а затем вручную вызывать методы addConverter(...) для добавления конвертеров.

Теперь мое преобразование работает. Но это неправильный способ сделать это - все мои регистрации XML, в том числе. аннотация @Component на классах конвертеров должна была работать. Поэтому вопрос все еще открыт.

@Override 
@InitBinder 
public void initBinder(WebDataBinder binder) { 

// Obtain a GenericConversionService via casting 
GenericConversionService conversionService = (GenericConversionService)binder.getConversionService(); 
// Manually add converters on it 
conversionService.addConverter(YesNoDataType.class, Boolean.class, new YesNoDataTypeToBooleanConverter()); 
conversionService.addConverter(Boolean.class, YesNoDataType.class, new BooleanToYesNoDataTypeConverter()); 

// Now it works -- these return TRUE 
System.out.println("Can convert YesNo -> Boolean? " + conversionService.canConvert(Boolean.class, YesNoDataType.class)); 
System.out.println("Can convert Boolean -> YesNo? " + conversionService.canConvert(YesNoDataType.class, Boolean.class));