2012-05-08 16 views
5

Una vez que moví mi aplicación de prueba a una aplicación productiva (?) Y comencé a probar en Tomcat, mis servicios REST basados ​​en Spring 3.1 han dejado de funcionar. Aunque se muestra el índice predeterminado.jsp, no se puede acceder a mi aplicación (http: // myhost: myport/test-webapp/myrestservice) y obtengo el recurso solicitado (/ test-webapp/myrestservice) no está disponible.Spring 3.1 REST con JSON: no funciona

Esto es lo que hice:

controlador:

package com.test.webapp.controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 

import com.test.webap.entity.Account; 

@Controller 
@RequestMapping("/myrestservice") 
public class AccountController{ 

@RequestMapping(method = RequestMethod.GET, produces="application/json") 
@ResponseBody 
public Account getEntity() { 
      // ... <simplified> 
    return new Account(//...); 
} 
} 

configuración de Despacho Servlet:

package com.test.webapp.web; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration; 

import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.ContextLoaderListener; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.servlet.DispatcherServlet; 
import com.test.webapp.config.AppConfig; 

public class AppInit implements WebApplicationInitializer { 

    private static final String DISPATCHER_SERVLET_NAME = "dispatcher"; 

    public void onStartup(ServletContext container) throws ServletException { 
     // Create the dispatcher servlet's Spring application context 
     AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 
     dispatcherContext.register(AppConfig.class); 

     // Manage the lifecycle of the root application context 
     container.addListener(new ContextLoaderListener(dispatcherContext)); 

     // Register and map the dispatcher servlet 
     ServletRegistration.Dynamic dispatcher = container.addServlet(
       DISPATCHER_SERVLET_NAME, new DispatcherServlet(dispatcherContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 

    } 
} 

clase de configuración:

package com.test.webapp.config; 

import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@ComponentScan(basePackages = {"com.test.webapp.controller"}) 
public class AppConfig{ 
    // Nothing here. Once I start using the beans, I will put them here 
} 

Y, web.xml tiene no mucho en it:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Test Web App</display-name> 
</web-app> 

No hay nada aparte de esto en mi proyecto. ¿Me estoy perdiendo de algo? El viejo proyecto que estaba haciendo un poco más como registrar las solicitudes entrantes de JSON, etc. (que se borró ahora) funcionaba, pero ya no lo tengo :(Así que muchos blues de novatos. Ayúdenme aquí. Muchas gracias. !

actualización problema se ha resuelto. Compruebe la respuesta

Respuesta

2

Incidencia resuelta. Sentí que este es un problema de contenedor 3.0 de Servlet y puede que algo en mi configuración de Tomcat 7 esté estropeado. Sin embargo, hice algunos cambios menores en web.xml y funciona bien ahora:

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    metadata-complete="false"> 

    <display-name>Test Web App</display-name> 
</web-app> 

Al parecer, tenía que decirle explícitamente Tomcat para explorar en busca de las implementaciones de ServletContainerInitializer y no todo está en web.xml a través de los metadatos atributo -complete = "false"

+1

Elimina el DOCTYPE, no es válido: le estás diciendo a la aplicación que es una aplicación versionada de Servlet 2.3 y 3.0. – Pidster

+0

Me di cuenta inmediatamente después de publicar la respuesta :-) Gracias por el comentario. – user1323865

0

has necesitado ir al gestor de Tomcat y ver lo que está desplegado? debe mostrar una lista de aplicaciones desplegadas. estoy pensando en el camino ha cambiado

+0

Ya lo hice, y veo/prueba-webapp allí. http: // myhost: myport/test-webapp/muestra el índice predeterminado.jsp, pero http: // myhost: myport/test-webapp/myrestservice genera "El recurso solicitado (/ test-webapp/myrestservice) no se encuentra "error en Tomcat7. – user1323865

2

¿Qué versión de Tomcat está utilizando en su entorno de producción? Parece que necesitará Tomcat 7 para obtener la implementación de las especificaciones de Servlet 3.0 es necesario para admitir su WebApplicationInitializer.

+0

Estoy en Tomcat 7.0.17. Y sí, en mi versión anterior de la aplicación, seguí Spring3.0 y el web.xml tiene entradas de configuración de arranque. Pero, por lo que yo entiendo, con Spring 3.1, no necesito hacer esta configuración en web.xml, debería haber encontrado WebApplicationInitializer. Acabo de recordar cómo mi web.xml era anterior, y cambiar a eso hace que esta aplicación funcione. Pero con Spring 3.1, ¿no se supone que debe funcionar sin tanta configuración en web.xml? ¡Gracias! – user1323865

+0

Gracias Joel, utilicé la sugerencia de tu Servlet3.0 y encontré una manera de hacer que las cosas funcionen. – user1323865

0

Puesto que usted es nuevo en la primavera me gustaría recomendar que echar un vistazo a mi respuesta anterior:

The requested resource (/) is not available

+0

Gracias.Ya me topé con tu respuesta mientras buscaba stackoverflow para encontrar una respuesta a mis problemas. Mientras agregaba Spring IDE al mercado de eclipse, todavía no podía resolver mi problema. – user1323865