Сегодня я перенес один из моих проектов, над которым я сейчас работаю, на Spring 4.0. Поскольку это очень простое веб-приложение, которое я использую для изучения и демонстрации возможностей Spring, мне нужно было только обновить POM-файл моего проекта и изменить версию Spring. Я развернул проект на сервере Tomcat 7 и, очевидно, приложение не запустилось. Я видел это сообщение в консоли IntelliJ: Failed to load bean class: pl.codeleak.t.config.RootConfig; nested exception is org.springframework.core.NestedIOException: Unable to collect imports; nested exception is java.lang.ClassNotFoundException: java.lang.annotation.Repeatable
Failed to load bean class: pl.codeleak.t.config.RootConfig; nested exception is org.springframework.core.NestedIOException: Unable to collect imports; nested exception is java.lang.ClassNotFoundException: java.lang.annotation.Repeatable
Failed to load bean class: pl.codeleak.t.config.RootConfig; nested exception is org.springframework.core.NestedIOException: Unable to collect imports; nested exception is java.lang.ClassNotFoundException: java.lang.annotation.Repeatable
. Что за …?
java.lang.annotation.Repeatable аннотация, которая является мета-аннотацией, используемой для пометки ваших аннотаций для многократного использования в Java 8 (но я использую Java 7 в проекте). Например:
1
2
3
4
5
6
|
@Repeatable (Schedules. class ) public @interface Schedule { ... } @Schedule (dayOfMonth= "last" ) @Schedule (dayOfWeek= "Fri" , hour= "23" ) public void doPeriodicCleanup() { ... } |
Это хорошо описано здесь: http://docs.oracle.com/javase/tutorial/java/annotations/repeating.html .
Spring 4 использует эту функцию в своей аннотации @PropertySource . Напомним, что аннотация @PropertySource предоставляет механизм для добавления источника пар свойств имя / значение в среду Spring, и он используется вместе с классами @Configuration . Как вы, наверное, уже знаете, я использую эту функцию в моей собственной конфигурации:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
@Configuration @PropertySource ( "classpath:/datasource.properties" ) public class DefaultDataSourceConfig implements DataSourceConfig { @Autowired private Environment env; @Override @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getRequiredProperty( "dataSource.driverClassName" )); dataSource.setUrl(env.getRequiredProperty( "dataSource.url" )); dataSource.setUsername(env.getRequiredProperty( "dataSource.username" )); dataSource.setPassword(env.getRequiredProperty( "dataSource.password" )); return dataSource; } } |
Первым подумал, что Spring больше не совместим с Java ниже 8. Невозможно. При поиске в GitHub я нашел совершенно новую аннотацию @PropertySources, которая является контейнером аннотаций @PropertySource . И это было мое решение проблемы совместимости с Java: использование аннотации @PropertySources в моем классе конфигурации, например:
1
2
3
4
5
6
7
8
|
@Configuration @PropertySources (value = { @PropertySource ( "classpath:/datasource.properties" )}) public class DefaultDataSourceConfig implements DataSourceConfig { @Autowired private Environment env; } |
Вот и все! После этого изменения мое приложение запустилось, и я увидел, что оно работает просто отлично!
РЕДАКТИРОВАТЬ : См .: https://jira.springsource.org/browse/SPR-11086