Spring не использует мой Conerverter. Зачем?
У меня есть пользовательский конвертер:
public class DateTimeConverter implements Converter<String, DateTime> {
private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
private DateTimeFormatter formatter;
private String datePattern = DEFAULT_DATE_PATTERN;
public String getDatePattern() {
return datePattern;
}
@Autowired(required = false)
public void setDatePattern(String datePattern) {
this.datePattern = datePattern;
}
@PostConstruct
public void init() {
formatter = DateTimeFormat.forPattern(datePattern);
}
@Override
public DateTime convert(String source) {
if (source == null) return new DateTime();
return formatter.parseDateTime(source);
}
}
И поле в JavaBean:
@NotNull
@Column(name = "dateandtime")
private DateTime dateAndTime;
Я зарегистрировал свой конвертер в настройках:
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.myapp.util.DateTimeConverter"/>
</list>
</property>
</bean>
Я получил это исключение:
Failed to convert property value of type 'java.lang.String' to required type 'org.joda.time.DateTime' for property 'dateAndTime'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.joda.time.DateTime] for property 'dateAndTime': no matching editors or conversion strategy found
Тестовое задание:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/resources/spring/business-config.xml")
public class JdbcTransactionRepositoryImplTest extends TestCase {
private static final Logger logger = Logger.getLogger(JdbcTransactionRepositoryImplTest.class);
@Autowired
private ApplicationContext context;
private JdbcTransactionRepositoryImpl transactionRepository;
@Before
public void setup() {
transactionRepository = new JdbcTransactionRepositoryImpl((DataSource) context.getBean("dataSource"));
}
@Test
public void testFindById() throws Exception {
Transaction tr1 = transactionRepository.findById(1);
assertEquals(new Long(1L), tr1.getId());
}
Но в этом случае:
@Test
public void testFindById() throws Exception {
ConversionService conversionService = (ConversionService) context.getBean("conversionService");
assertTrue(conversionService.canConvert(String.class, DateTime.class));
Построй успех!
Я не понимаю: почему?
Спасибо за любую помощь
1 ответ
Вам не нужно создавать собственный конвертер или регистрировать сервис конвертации - если Joda-Time находится в пути к классам проекта, Spring автоматически включит конвертации через @DateTimeFormat
аннотация (<mvc:annotation-driven />
необходимо).
Так что вам нужно просто:
@NotNull
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private DateTime dateAndTime;