2015-04-16 5 views
8

Sto cercando di implementare ehcache per la mia domanda, ma quando prova invocando il server, ottenendo il seguente errore -ApplicationEventMulticaster non inizializzata - chiamare 'Aggiorna' prima che gli eventi multicasting

java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: WebApplicationContext for namespace 'dispatcher-servlet': startup date [Thu Apr 16 14:37:53 IST 2015]; root of context hierarchy 
    at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:344) 
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:331) 
    at org.springframework.web.servlet.FrameworkServlet.publishRequestHandledEvent(FrameworkServlet.java:1061) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:996) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 

passaggi che ho seguito -

STEP1 - Creato il file ehcache.xml sotto /src/main/resources come si può vedere qui sotto -

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="ehcache.xsd" 
    updateCheck="true" 
    monitoring="autodetect" 
    dynamicConfig="true"> 

    <diskStore path="java.io.tmpdir" /> 

    <cache name="movieFindCache" 
     maxEntriesLocalHeap="10000" 
     maxEntriesLocalDisk="1000" 
     eternal="false" 
     diskSpoolBufferSizeMB="20" 
     timeToIdleSeconds="300" timeToLiveSeconds="600" 
     memoryStoreEvictionPolicy="LFU" 
     transactionalMode="off"> 
     <persistence strategy="localTempSwap" /> 
    </cache> 

</ehcache> 

STEP2 - Aggiunto seguente t o appconfig.java

@Bean 
    public CacheManager getEhCacheManager(){ 
      return new EhCacheCacheManager(getEhCacheFactory().getObject()); 
    } 
    @Bean 
    public EhCacheManagerFactoryBean getEhCacheFactory(){ 
     EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean(); 
     factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); 
     factoryBean.setShared(true); 
     return factoryBean; 
    } 

PASSO3 - Aggiunto seguente per webappinitializer.java che è chiamato all'avvio

AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(AppConfig.class); 
     ctx.register(HibernateConfiguration.class); 
     ctx.setServletContext(servletContext);  
     Dynamic dynamic = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     dynamic.setLoadOnStartup(1); 

STEP4 - pom.xml contiene -

<dependencies> 
    <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>4.0.6.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>4.0.6.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.8.Final</version> 
    </dependency> 




    <dependency> 
     <groupId>net.sf.ehcache</groupId> 
     <artifactId>ehcache</artifactId> 
     <version>2.9.0</version> 
    </dependency> 

     <!-- Optional, to log stuff --> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.0.13</version> 
    </dependency> 

    <!-- Spring caching framework inside this --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.1.4.RELEASE</version> 
    </dependency> 

    <!-- Support for Ehcache and others --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context-support</artifactId> 
     <version>4.1.4.RELEASE</version> 
    </dependency> 





    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-osgi</artifactId> 
     <version>4.3.8.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-envers</artifactId> 
     <version>4.3.8.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-c3p0</artifactId> 
     <version>4.3.8.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-proxool</artifactId> 
     <version>4.3.8.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-infinispan</artifactId> 
     <version>4.3.8.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-ehcache</artifactId> 
     <version>4.3.8.Final</version> 
    </dependency> 

non sono in grado di capire la causa principale di l'errore sopra. Qualsiasi aiuto è apprezzato.

+0

Per i principianti non mescolare le versioni di molla, in secondo luogo utilizzare gli avviatori e utilizzare il caricamento a molla per la configurazione. –

+0

usa gli starter significa? Inoltre, se potessi, per favore, elaborare un po 'usando l'avvio a molla per la configurazione. Pensavo di usare lo stesso. –

+0

Si sta utilizzando l'avvio a molla ma si sta impegnando molto a non utilizzare l'avvio a molla. Specificando tutta la configurazione, non utilizzando le funzionalità di configurazione automatica e non utilizzando gli avviatori di avvio a molla. –

risposta

1

L'idea alla base del boot a molla è che tutte le configurazioni vengono eseguite automaticamente entro la primavera.

In questo caso utilizzare il seguente POM.

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.3.RELEASE</version> 
    </parent> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context-support</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context-support</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
     <groupId>net.sf.ehcache</groupId> 
     <artifactId>ehcache</artifactId> 
     <version>2.9.0</version> 
    </dependency> 
    <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
    </dependencies> 

Aggiungere le seguenti application.properties nelle vostre src/main/risorse.

spring.datasource.url=jdbc:mysql://localhost:3306/soschema 
spring.datasource.username=root 
spring.datasource.password=root123 
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

# Specify the DBMS 
spring.jpa.database = MYSQL 

# Show or not log for each sql query 
spring.jpa.show-sql = true 

# Hibernate settings are prefixed with spring.jpa.hibernate.* 
spring.jpa.hibernate.ddl-auto = update 
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy 

Aggiungi il file AppConfig,

package org.arunm.ehcacheconfig; 


import org.springframework.cache.CacheManager; 
import org.springframework.cache.ehcache.EhCacheCacheManager; 
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.io.ClassPathResource; 


@Configuration 
public class AppConfig { 

    @Bean 
    public CacheManager getEhCacheManager(){ 
      return new EhCacheCacheManager(getEhCacheFactory().getObject()); 
    } 
    @Bean 
    public EhCacheManagerFactoryBean getEhCacheFactory(){ 
     EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean(); 
     factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); 
     factoryBean.setShared(true); 
     return factoryBean; 
    } 

} 

aggiungere una classe di livello superiore con il seguente codice,

package org.ehcachetest; 

import java.util.Arrays; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.ComponentScan; 

/** 
* Hello world! 
* 
*/ 

@EnableAutoConfiguration 
@ComponentScan 
public class App 
{ 
    public static void main(String[] args) 
    { 
     ApplicationContext ctx = SpringApplication.run(App.class, args); 

     String[] beanNames = ctx.getBeanDefinitionNames(); 
     Arrays.sort(beanNames); 
     for (String beanName : beanNames) { 
      System.out.println(beanName); 
     } 
    } 
} 

Se si esegue App il metodo principale troverete che la primavera è automaticamente creato sessionFactory, TransactionManager ecc. Non è necessaria alcuna configurazione manuale, il che significa che non è necessario aggiungere il dispatcherservlet, la configurazione di ibernazione, ecc. Tutto è gestito dalla primavera.

+0

Grazie ArunM per essere così articolato. Provandolo come hai suggerito. Ma non esiste una classe di alto livello che sembra ma webinitializer.java che ha un metodo 'onstartup'.Qualche suggerimento? –

+0

Il punto è che non hai bisogno di un webinitializer.jav. La primavera l'ha già creato per te. Esegui il codice e controlla l'output se la classe App. Puoi vedere l'elenco dei bean. Guarda anche i video su youtube da springdeveloper .. – ArunM

5

Questo è un po 'stupido, ma il mio problema era che avevo inserito la classe @SpringBootApplication (app, applicazione, WebApplication nella maggior parte dei progetti) all'interno del pacchetto predefinito. Quindi, tutto era in totale disordine.

Non sono sicuro del motivo per cui si è verificato questo errore esatto, ma spostando la classe dell'applicazione su un pacchetto è stato sicuramente risolto.

+0

In effetti, spostando stranamente la classe dell'applicazione starter in un altro pacchetto risolve il problema. –