Ho configurato e funzionante l'applicazione REST basata su Spring, ma ora mi piacerebbe convertirlo in Spring-Boot.Convertire l'applicazione Spring esistente in Spring-Boot
La mia applicazione utilizza Primavera-Data-JPA in cima JPA origine dati con Hibernate fornitore:
@Configuration
@EnableJpaRepositories("foo.bar.web.repository")
@EnableTransactionManagement
public class RepositoryConfig {
// properties ommited
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(className);
dataSource.setUrl(url);
dataSource.setUsername(userName);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factory.setPackagesToScan("foo.bar.web.domain");
factory.setDataSource(dataSource());
factory.setJpaPropertyMap(new HashMap<String, Object>() {{
put("hibernate.dialect", dialect);
put("hibernate.hbm2ddl.auto", hbm2ddl);
}});
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory());
return transactionManager;
}
}
miei endpoint REST implementate utilizzando SpringMVC con seguente configurazione:
@Configuration
@EnableWebMvc
@ComponentScan("foo.bar.web.controller")
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public MultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
}
Web initializer:
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{
ApplicationConfig.class,
RepositoryConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{MvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
Il problema è che non voglio usare Spring-Boo t configurazione automatica perché mi piacerebbe riutilizzare le mie classi di configurazione esistenti con modifiche minime, ma non riesco a trovare il modo corretto per farlo. Ho provato ad implementare la classe di applicazione Spring-boot annotata con @SrpingBootApplication
, ma non sono sicuro al 100% che le mie classi di configurazione vengano utilizzate, perché in questo caso ottengo java.lang.ClassCastException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean$$EnhancerBySpringCGLIB$$ba21071f cannot be cast to javax.persistence.EntityManagerFactory
.
Inoltre ho provato a gettare via l'annotazione @EnableAutoConfiguration dalla classe dell'applicazione e aggiungere il bean TomcatEmbeddedServletContainerFactory
manualmente al mio contesto, ma in questo caso tomcat incorporato non è configurato correttamente.
Sarebbe bello se qualcuno potesse darmi un suggerimento su come risolvere il mio problema. Credo che tutto ciò che devo fare sia in qualche modo sostituire il mio WebInitilizer con la configurazione di Spring-Boot.
Suggerirei di utilizzare le funzioni di configurazione automatica in quanto ciò consentirebbe sostanzialmente di abbandonare la maggior parte della configurazione o di inserire in 'application.properties'. E il miglior codice gestibile è il codice non scritto. –
Sono assolutamente d'accordo con te sul fatto che l'auto config sia una buona funzionalità, ma questo è il mio progetto educativo e penso che la configurazione manuale sia più utile per capire come funzionano tutte queste funzionalità e come sono correlate a "SpringMVC tradizionale" – Alex
non voglio usare Spring Boot o almeno stai lavorando duramente per usarne il meno possibile. Ma se davvero devi semplicemente eliminare il tuo 'WebInitializer' e sostituirlo con uno che estenda la classe' SpringBootServletInitializer'. –