2012-01-12 23 views
6

Me pregunto si se llama al método init de un HttpServlet después de la deserialización.HttpServlet ciclo de vida y serialización

No sé si algún contenedor serializa un servlet pero implementa la interfaz Serializable, por lo que existe la posibilidad de hacerlo.

El JavaDoc para el método init señala: "Llamado por el contenedor de servlets para indicar a un servlet que el servlet se está poniendo en servicio".

¿La deserialización equivale a "poner en servicio"?

+2

Estoy bastante seguro de que un servlet nunca se serializa. Es un singleton, y es típicamente completamente apátrida. Yo no vería el punto de serializarlo. De todos modos, sin importar si está recién instanciado o deserializado, se debe llamar al método init cuando se pone en servicio, por lo que un contenedor de servlet estaría en violación de la especificación si pone el servlet en servicio sin inicializarlo. –

Respuesta

5

Si bien nunca he tratado con un contenedor que cambiaría un servlet serialándolo, y sinceramente no puedo imaginarme cuándo un contenedor moderno haría esto, pero siempre he entendido que init() se llama exactamente una vez para el servlet en su ciclo de vida, por lo tanto, se llamaría no nuevamente en deserialización. Como con cualquier cosa Serializable, necesitaría escribir un manejo especial implementando readFields().

+3

Ok aquí comienza a ser complicado. El GenericServlet (que introduce la interfaz Serializable en la jerarquía) solo dice: "Llamado por el contenedor de servlet para indicar a un servlet que el servlet se está poniendo en servicio". El otro punto: "El contenedor de servlets llama al método init exactamente una vez después de crear instancias del servlet". se dice en la interfaz JavaDoc de Servlet que no es serializable. – cpater

+2

Otro punto es que el ServletConfig que se pasa al método init se almacena en un campo transitorio ... – cpater

Cuestiones relacionadas