2014-07-17 9 views
5

Ho seguito this tutorial. Ora se lo uso tramite Spring Boot funziona, ma se provo a distribuirlo (rimuovere la classe dell'applicazione) su Apache Tomcat 7 ottengo 404 risposte. Ho anche provato a creare la mia configurazione personale: qualcosa del genere:L'app Spring Boot non funziona quando distribuito in Tomcat autonomo

@Configuration 
public class MongoConfiguration { 

    public @Bean MongoDbFactory mongoDbFactory() throws Exception { 
     return new SimpleMongoDbFactory(new Mongo("127.0.0.1", 27017), "movies"); 
    } 

    public @Bean MongoTemplate mongoTemplate() throws Exception { 
     return new MongoTemplate(mongoDbFactory()); 
    } 
} 

Ancora non funziona. Quindi 2 domande.

  1. come eseguire questo su Tomcat (come rendere semplice riposo e girare su Tomcat)
  2. come configurare Mongo tramite l'annotazione (solo per ottenere il mio database)

Nota: per impostazione predefinita usa test vile eseguendo il boot di primavera e posso farlo funzionare tramite semplici controller (invece di @RepositoryRestResource) ma voglio riuscire a arricciare http://localhost:8080 e ottenere risposta con le opzioni.

risposta

19

Ti sei assicurato di aver seguito lo section on traditional deployments della documentazione di riferimento Boot? Da quello che descrivi, non sembra che Spring Data REST o MongoDB non funzionino, ma la distribuzione non funziona affatto.

Il trucco dovrebbe essere quello di lasciare che la classe di configurazione principale è necessario implementare un'interfaccia speciale in modo che il contenitore di servlet può trovare la configurazione di bootstrap (campione prelevato dalla documentazione di riferimento):

@Configuration 
@EnableAutoConfiguration 
@ComponentScan 
public class Application extends SpringBootServletInitializer { 

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

SpringBootServletInitializer è l'aspetto chiave qui in quanto è il tipo che si aggancia al meccanismo di bootstrap di Servlet 3 per le applicazioni web tradizionali. I documenti di riferimento hanno anche instructions su come far funzionare un'app di avvio nei contenitori Servlet precedenti a Servlet 3.0.

Si noti inoltre, che quando un app viene distribuita in un contenitore autonomo, di solito non è disponibile tramite la radice (cioè http://localhost:8080/), ma un contesto dedicato dal nome del file WAR distribuito (ad esempio http://localhost:8080/my-app).

+0

extends SpringBootServletInitializer mancante. Stavo cercando di rimuovere questa classe di applicazioni e di inserire elementi in web.xml ma volevo farlo funzionare in questo modo perché è molto più facile da leggere. Grazie mille. Informazioni sulla distribuzione su localhost - stavo usando "@RequestMapping" su "/" e mi ha dato risposta su localhost senza/myapp ma questo era quando usavo web.xml e "@Controller" + lo stavo distribuendo via molla tool suit (quando corro manualmente tomcat ovviamente ho bisogno/myapp) Ancora grazie mille per la risposta. – unknown

1

Ho incontrato una versione diversa di questo problema dovuta alla versione java. Tutte le configurazioni erano corrette nel pom.

<properties> 
    ...  
    <tomcat.version>8.0.39</tomcat.version> 
    <java.version>1.8</java.version> 
    ... 
</properties> 

scopre il server è stato in esecuzione OpenJDK versione 7. Non ci sono stati errori nei log di Tomcat all'avvio, ma anche nessuna uscita dall'applicazione primavera.

Dopo l'aggiornamento del server a Oracle JDK versione 8, tutto è stato avviato correttamente.

+0

Utile da sapere. Grazie anche se sono in ritardo non l'ho visto prima nelle notifiche. – unknown

0

Ho riscontrato lo stesso problema con Tomcat (7.0.82) più recente. Dopo che le altre soluzioni descritte qui non hanno funzionato per me sono stato in grado di risolvere il problema mediante l'attuazione di un'altra classe ServletInitializer.java:

import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.web.support.SpringBootServletInitializer; 

public class ServletInitializer extends SpringBootServletInitializer { 

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

invece di estendere MyApp.java:

... 
@SpringBootApplication 
public class MyApp extends SpringBootServletInitializer { 
    ... 
} 

Vedere https://www.youtube.com/watch?v=92ceKwUZoA0 per un completo tutorial.