2016-06-21 16 views
8

Ho un'applicazione web Primavera 4 (webapp-module.war) di lavoro e in esecuzione a livello locale in Eclipse utilizzando Java 8, Tomcat 8 e JavaConfig (senza web.xml):primavera JavaConfig e Tomcat 8

enter image description here

Ma quando schiero a Tomcat 8 (stessa versione sto utilizzando localmente in Eclipse) su un server Ubuntu remota ottengo:

enter image description here

ho verificato host e la porta, che siano corrette. Non v'è alcun errore nel registro (/var/lib/tomcat8/logs/catalina.out)

Jun 21, 2016 10:32:44 PM org.apache.catalina.startup.HostConfig undeploy 
INFO: Undeploying context [/webapp-module] 
Jun 21, 2016 10:32:44 PM org.apache.catalina.startup.HostConfig deployWAR 
INFO: Deploying web application archive /var/lib/tomcat8/webapps/webapp-module.war 
Jun 21, 2016 10:32:46 PM org.apache.jasper.servlet.TldScanner scanJars 
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
Jun 21, 2016 10:32:46 PM org.apache.catalina.startup.HostConfig deployWAR 
INFO: Deployment of web application archive /var/lib/tomcat8/webapps/webapp-module.war has finished in 1,870 ms 
[email protected]:/var/lib/tomcat8/logs# 

Il log di accesso contiene:

[email protected]:/var/log/tomcat8# cat localhost_access_log.2016-06-22.txt 
xx.xxx.xxx.xx - - [22/Jun/2016:22:36:00 +0200] "GET /webapp-module/ HTTP/1.1" 404 1040 
xx.xxx.xxx.xx - - [22/Jun/2016:22:36:00 +0200] "GET /favicon.ico HTTP/1.1" 404 1034 
xx.xxx.xxx.xx - - [22/Jun/2016:22:36:50 +0200] "GET /webapp-module/hello HTTP/1.1" 404 1050 

Dove è la xx.xxx.xxx.xx IP del mio computer locale da cui provo ad accedere all'app Web nel mio browser.

Ho dato un'occhiata a: Spring Java Config: Tomcat deploy without web.xml ma in realtà non fornisce una soluzione.

dettagli sul mio progetto di seguito:

Fonti

enter image description here

Config.java

@Configuration // Marks this class as configuration 
// Specifies which package to scan 
@ComponentScan("com.samples") 
// Enables Spring's annotations 
@EnableWebMvc 
public class Config { 

    @Bean 
    public UrlBasedViewResolver setupViewResolver() { 
    UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 
    resolver.setPrefix("/WEB-INF/jsp/"); 
    resolver.setSuffix(".jsp"); 
    resolver.setViewClass(JstlView.class); 
    return resolver; 
    } 

} 

WebInitializer.java

public class WebInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 

    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
    ctx.register(Config.class); 
    ctx.setServletContext(servletContext); 

    Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
    servlet.addMapping("/"); 
    servlet.setLoadOnStartup(1); 

    } 

} 

HelloController.java

@Controller 
public class HelloController { 

    @RequestMapping("/") 
    public String home() { 
    return "index"; 
    } 

    @RequestMapping("/hello") 
    public String showhello(ModelMap model) { 
    model.addAttribute("message", "Hello Spring MVC Framework!"); 
    return "hello"; 
    } 

} 
+0

Controllare se un colpo è stato ottenuto all'interno ** localhost_access_log. *. Txt ** Tomcat all'interno ** ** tronchi cartella –

+0

Non sei sicuro di quello che vuoi dire, ma ho aggiornato la questione con il contenuto dal più recente log di accesso sul server dopo che ho provato ad accedere all'app Web dal mio browser. Non mostra alcun errore però – u123

+1

Potrebbero sembrare domande stupide, ma il file di guerra è denominato webapp-module? Suppongo che lo stiate eseguendo anche in un'istanza di tomcat mentre in eclissi, le versioni di tomcat corrispondono? –

risposta

4

dispiace precedenza ero troppo frettoloso

Sembra che il contesto di primavera non è affatto caricato.

Credo che il problema è in questo pezzo di codice:

public class WebInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 

    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
    ctx.register(Config.class); 
    ctx.setServletContext(servletContext); 

    Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
    servlet.addMapping("/"); 
    servlet.setLoadOnStartup(1); 

    } 

} 

hai usato ctx.register(Config.class);

In ogni caso ho sempre usato questo tipo di inizializzazione:

public class AppInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     // Create the 'root' Spring application context 
     AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
     rootContext.scan("com.spring"); 
     rootContext.setConfigLocations(new String[]{"com.spring.config.WebAppContextConfig", "com.spring.config.AppConfig"}); 
     // Manages the lifecycle of the root application context 
     servletContext.addListener(new ContextLoaderListener(rootContext)); 

     // Declare dispatcher servlet. Handles requests into the application 
     ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", 
       new DispatcherServlet(rootContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 

    } 

} 

come si può vedi Ho usato rootContext.setConfigLocations per specificare dove trovare le classi di configurazione della molla

In ogni caso Here è possibile trovare un esempio di lavoro ho schierato con successo su Tomcat versione 8.0.39 e 8.5.4

Spero che sia utile

Angelo

+0

Puoi includere il context.xml nell'esempio? – sonance207

+0

@ sonance207 Non ho file context.xml in questo esempio ... Mi dispiace –

-1

Aggiungi finalName come ROOT nel vostro pom.xml. Questo creerà il file ROOT.war nella cartella di destinazione.

<build> 
     <plugins> 
<!--All plugins are here --> 
     </plugins> 
     <finalName>ROOT</finalName> 
    </build> 

Successivamente, se si distribuisce il file ROOT.war nel tomcat. Quindi l'URL di accesso sarà http://localhost:8080

Spero che risolva il problema.

Per ulteriori controlli, passare attraverso http://localhost:8080/manager/html chiamerà per nome utente e password. Verifica che sia impostato o meno.

Se non è impostata, si prega di passare attraverso questo tutorial: Can't access Tomcat 8 Manager App come suggerito da E-Riz

Per la piena esempio, passare attraverso questo tutorial: http://websystique.com/springmvc/spring-4-mvc-helloworld-tutorial-annotation-javaconfig-full-example/

+0

Ho provato l'esempio di websystique. Funziona con Tomcat/Win 10, ma funziona su server tomcat/RHL. Entrambi hanno TC 8.0.18. PS: la nostra politica dell'organizzazione non consente l'app manager per motivi di sicurezza, quindi non è un'opzione. :( – zendu

+0

@zendu Per la distribuzione del server, l'app manager non è consentita. Hai provato con ROOT.war per il server? Verifica se esiste un errore, condividi il file di registro. – SkyWalker

0

scopre che non stavo facendo niente di male nel codice. Il server Tomcat è configurato per l'utilizzo rigoroso della conformità del servlet.

org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true 

Questa impostazione interessa più altre proprietà (see here). Uno di questi è "L'attributo resourceOnlyServlets di qualsiasi elemento Context". L'impostazione di questo valore su "jsp" nel contesto dell'applicazione.xml ha risolto il problema.

Elenco separato da virgola di nomi servlet (come utilizzato in /WEB-INF/web.xml) che prevedono la presenza di una risorsa. Garantisce che i file di benvenuto associati ai servlet che prevedono la presenza di una risorsa (come il servlet JSP) non vengano utilizzati quando non è presente alcuna risorsa. Ciò impedisce problemi causati dalla chiarificazione del mapping del file di benvenuto nella sezione 10.10 della specifica Servlet 3.0. Se la proprietà di sistema org.apache.catalina.STRICT_SERVLET_COMPLIANCE è impostata su true, il valore predefinito di questo attributo sarà la stringa vuota, altrimenti il ​​valore predefinito sarà jsp.

Problemi correlati