2011-09-30 10 views
7

Estoy implementando una aplicación GWT 2.4 en Glassfish 3.0.1. Puedo acceder fácilmente a mi solicitud a través de http://host:PORT/appContext/
Sin embargo, cuando me proxy inverso de la aplicación con Apache consigo una excepción con el siguiente extracto (de troncos Glassfish):¿Cuál es el efecto del proxy inverso en una aplicación GWT?

excepción al envío de llamada entrante RPC com.google. gwt.user.client.rpc.SerializationException: El tipo 'com.ozdokmeci.basicgwtproject.shared.GroupData' no se puede asignar a 'com.google.gwt.user.client.rpc.IsSerializable' y no tiene un serializador de campo personalizado . Por motivos de seguridad, este tipo no se serializará.

La implementación de IsSerializable resuelve el problema según lo aconsejado por Chi en un related question. También hay otras soluciones en la pregunta relacionada.

Mi pregunta es ¿cuál es la causa subyacente de esto y cómo dos soluciones aparentemente no relacionadas (implementando una interfaz de marcador y extendiendo una clase de servlet) resuelven este problema? También hay desventajas para ambos métodos mencionados en el related question?

Nota: La excepción no se produce si se llega directamente a la aplicación.

Nota 2: La clase relacionada con la excepción ya implementa la interfaz Serializable, que debería ser equivalente a IsSerializable en lo que respecta a GWT.

+0

¿Estás seguro de que la excepción solo se produce cuando se accede a través de Apache? Necesitas comprobar esa suposición. Creo que el error está ocurriendo incluso cuando accedes a él directamente. La excepción no tiene nada que ver con el proxy inverso. – gkamal

+0

La excepción se produce solo cuando se envía un proxy detrás de Apache (no estoy sugiriendo que Apache lo esté causando). Cuando accedo a la aplicación directamente, no se produce tal excepción. Esto no era una suposición y revisé los registros más de una vez antes de publicar la pregunta. Sé que la excepción no está directamente relacionada con el proxy inverso y es por eso que hice la pregunta :) – Kaan

+0

Creo que hay algo más que está yendo mal, cuando dices no apache es que el alojado/devmode o el acceso a la versión js compilada . ¿Puede verificar si ambos están ejecutando la misma versión de código (se descartan el almacenamiento en caché, la compilación incorrecta, etc.)? Haga algún cambio visible en la página principal y verifique si el cambio aparece a través del proxy apache. – gkamal

Respuesta

3

Tuve exactamente el mismo problema y cuando tracé el código fuente encontré que el directorio de los archivos de serialización GWT no se encontraba cuando el proxy inverso (creo que porque el directorio era una ruta relativa). Es por eso que está obteniendo excepciones de serialización a pesar de que ha implementado IsSerializable.

Mi solución al final fue pasar a un descanso JSON para mi RPC. El uso de JSON le permitirá revertir el proxy porque no necesita encontrar estos archivos de serialización.

Editar

Si desea seguir utilizando GWT RPC sin embargo, tengo una idea de cómo es posible (aunque no he implementado yo mismo).

En primer lugar, echar un vistazo a la ayuda GWT sobre estos archivos RPC: https://developers.google.com/web-toolkit/doc/2.4/DevGuideCompilingAndDebugging#key_application_files

Usted notará que dice:

archivo de política

La serialización debe ser accesible para su RemoteServiceServlet RPC a través de la ServletContext .getResource() llame a

Por lo tanto, deberá anular RemoteServiceServlet y volver a señalar la ubicación de los archivos rpc (política de serialización).

Aquí es una sugerencia, tomada de este sitio: http://code.google.com/p/google-web-toolkit/issues/detail?id=4817

public class MyRemoteServiceServlet extends RemoteServiceServlet 
    { 

    ... 

    @Override 
    protected SerializationPolicy doGetSerializationPolicy(
      HttpServletRequest request, String moduleBaseURL, String strongName) { 
      //get the base url from the header instead of the body this way 
      //apache reverse proxy with rewrite on the header can work 
      String moduleBaseURLHdr = request.getHeader("X-GWT-Module-Base"); 

      if(moduleBaseURLHdr != null){ 
        moduleBaseURL = moduleBaseURLHdr; 
      } 

      return super.doGetSerializationPolicy(request, moduleBaseURL, strongName); 
    } 

    ... 

En Agregar configuración de Apache:

ProxyPass /app/ ajp://localhost:8009/App-0.0.1-SNAPSHOT/ 

    <Location /app/> 

    RequestHeader edit X-GWT-Module-Base ^(.*)/app/(.*)$ $1/App-0.0.1-SNAPSHOT/$2 

    </Location> 

Espero que mi sugerencia anterior, al menos, los puntos de alguien en la dirección correcta. Háganos saber si alguien implementa esto y funciona.

+0

Su solución es agradable. Sería beneficioso para otros si pudieras elaborar sobre la causa subyacente (¿directorios relativos?) O delinear la estructura de la serialización de GWT si lo sabes :) Gracias – Kaan

+0

@Kaan - De acuerdo, he actualizado mi solución con más detalles ... . Todavía no lo he implementado, así que pruébalo y hazles saber a todos si funciona. – jasop

+0

@jsop - Gracias por la actualización, buena sugerencia y puntero. No podré probar esto pronto. Aceptando como respuesta hasta entonces. – Kaan

Cuestiones relacionadas