2015-03-23 9 views
8

Ich habe konfiguriert und arbeite Frühling basierte REST-Anwendung, aber jetzt würde Ich mag es konvertieren zum Frühling-Boot.Konvertieren bestehenden Frühling Anwendung Spring-Boot

Meine Anwendung verwendet Frühlings-Data-PPV auf der JPA-Datenquelle mit Hibernate Anbietern:

@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; 
    } 
} 

Meine REST-Endpunkte mit SpringMVC mit folgenden Konfiguration implementiert:

@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[]{"/"}; 
    } 
} 

Das Problem ist, dass ich Spring-Boo nicht verwenden möchte t automatische Konfiguration, weil ich meine vorhandenen Konfigurationsklassen mit minimalen Änderungen wiederverwenden möchte, aber ich kann den richtigen Weg dafür nicht finden. Ich habe versucht, Frühlings-Boot-Anwendungsklasse mit @SrpingBootApplication kommentierte zu implementieren, aber ich bin mir nicht 100% sicher, dass meine Config-Klassen verwendet werden, da in diesem Fall ich java.lang.ClassCastException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean$$EnhancerBySpringCGLIB$$ba21071f cannot be cast to javax.persistence.EntityManagerFactory bekommen.

Auch ich habe versucht, @EnableAutoConfiguration Annotation aus der Anwendungsklasse wegwerfen und TomcatEmbeddedServletContainerFactory Bean zu meinem Kontext manuell hinzufügen, aber in diesem Fall Embedded Tomcat ist nicht richtig konfiguriert.

Es whould toll, wenn mir jemand einen Tipp geben kann, wie mein Problem zu lösen. Ich glaube, dass ich nur meinen WebInitizer durch Spring-Boot Config ersetzen muss.

+1

Ich würde vorschlagen, die Auto-Config-Funktionen zu verwenden, so dass Sie grundsätzlich die meisten Ihrer Konfiguration Graben oder in die 'application.properties'. Und der beste wartbare Code ist Code nicht geschrieben. –

+0

ich mit Ihnen, dass die automatische Konfiguration eine gute Eigenschaft völlig einverstanden ist, aber das ist mein pädagogisches Projekt und ich denke, dass eine manuelle Konfiguration mehr nützlich für das Verständnis, wie all diese Funktionen funktioniert und wie sie im Zusammenhang mit „traditionellen SpringMVC“ – Alex

+0

Also im Grunde ist man Ich möchte Spring Boot nicht benutzen oder zumindest hart arbeiten, um so wenig wie möglich davon zu verwenden. Aber wenn Sie wirklich Ihren 'WebInitializer' ablegen müssen und ersetzen Sie ihn stattdessen durch einen, der die' SpringBootServletInitializer' Klasse erweitert. –

Antwort

6

Nach einem Tag in einem Forschungs verbringen, fand ich endlich einen solition meines Problems. Zunächst einmal musste ich meine EntityManagerFactory() und transaction() Bohnen ändern:

@Bean 
    public LocalContainerEntityManagerFactoryBean 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; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return transactionManager; 
    } 

auch vollständig entfernt ich meine WebInitializer Klasse und entfernt @EnableWebMvc Anmerkung aus MvcConfig. In Spring-Boot ist es nicht möglich, die Klasse von WebMvcConfigurerAdapter in classpath zu erweitern, da Spring-Auto dann automatisch alle SpringMVC betreffenden Einstellungen überspringt. Hier ist die letzte Version meiner MvcConfig Klasse:

@Configuration 
@ComponentScan("foo.bar.web.controller") 
public class MvcConfig { 

    @Bean 
    public MultipartResolver multipartResolver() { 
     return new CommonsMultipartResolver(); 
    } 
} 

ich die Version von Spring-Boot-Anwendungsklasse verwendet, die in doc gezeigt:

@SpringBootApplication(exclude = MultipartAutoConfiguration.class) 
public class Application extends SpringBootServletInitializer { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 
    } 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 
} 

Beachten Sie, dass in meinem Fall musste ich ausschließen MultipartAutoConfiguration von der automatischen Konfiguration, da ich diese Funktion bereits in MvcConfig konfiguriert habe. Bun es ist auch möglich, es autokonfiguriert zu lassen, aber in diesem Fall musste ich die Dateigröße in der Konfigurationsdatei application.properties anpassen oder eine MultipartConfigElement-Bean zu meinem Klassenpfad hinzufügen.

Verwandte Themen