Cuando estoy en modo lista y teniendo la tabla registros, si me quiero pasar al modo detalle me aparece el mensaje:
Imposible ir a modo detalle, no hay elementos en la lista.
Además me muestra una excepción porque el tab es null. Es como si perdiera la referencia a la vista.
Lo he probado en Tomcat y en Weblogic fuera del portal y en estos casos si funciona correctamente.
Estoy utilizando Liferay 5.2.3
Adjuto la clase y la traza de la excepción por si puede dar alguna pista.
Un saludo y gracias por adelantado.
@Entity
@Table(name = "COMERCIO")
public class Comercio implements java.io.Serializable {
public void setcomercio(String comercio) {
this.comercio = comercio;
}
}
2011-06-01 09:13:03,578 | ERROR | Tab:331 |
java.lang.NullPointerException
at org.openxava.component.MetaComponent.get(MetaComponent.java:57)
at org.openxava.tab.Tab.getMetaTab(Tab.java:237)
at org.openxava.tab.Tab.createTableModel(Tab.java:347)
at org.openxava.tab.Tab.getTableModel(Tab.java:328)
at org.openxava.tab.Tab.getTotalSize(Tab.java:921)
at org.openxava.actions.GoDetailAction.execute(GoDetailAction.java:27)
at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:379)
at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:296)
at org.openxava.controller.ModuleManager.execute(ModuleManager.java:256)
at jsp_servlet._web_45_inf._jsp._xava.__execute._jspService(__execute.java:200)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:524)
at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:444)
at org.openxava.web.servlets.Servlets.getURIAsStream(Servlets.java:66)
at org.openxava.web.dwr.Module.getURIAsStream(Module.java:183)
at org.openxava.web.dwr.Module.request(Module.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at es.gv.pca.ox.filters.LocaleFilter.doFilterInternal(LocaleFilter.java:78)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:176)
2011-06-01 09:13:03,578 | WARN | Tab:924 | ¡ADVERTENCIA! Imposible obtener el tamaño total de un tab
java.lang.NullPointerException
at org.openxava.component.MetaComponent.get(MetaComponent.java:57)
at org.openxava.tab.Tab.getMetaTab(Tab.java:237)
at org.openxava.tab.Tab.cloneMetaTab(Tab.java:230)
at org.openxava.tab.Tab.restoreDefaultProperties(Tab.java:1243)
at org.openxava.tab.Tab.getTableModel(Tab.java:332)
at org.openxava.tab.Tab.getTotalSize(Tab.java:921)
at org.openxava.actions.GoDetailAction.execute(GoDetailAction.java:27)
at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:379)
at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:296)
at org.openxava.controller.ModuleManager.execute(ModuleManager.java:256)
at jsp_servlet._web_45_inf._jsp._xava.__execute._jspService(__execute.java:200)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:524)
at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:444)
at org.openxava.web.servlets.Servlets.getURIAsStream(Servlets.java:66)
at org.openxava.web.dwr.Module.getURIAsStream(Module.java:183)
at org.openxava.web.dwr.Module.request(Module.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at es.gv.pca.ox.filters.LocaleFilter.doFilterInternal(LocaleFilter.java:78)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:176)
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
este problema es muy extraño para mí. Es como si el objeto tab desapareciera mágicamente de la sesión. Investiga en la documentación y foros sobre weblogic + liferay para ver si encuentras algún problema parecido. Si no tendremos que depurar hasta averiguar que es lo que está pasando. Lo que más me preocupa es que si el objeto xava_tab desaparece, también le puede pasar lo mismo a otros objetos de sesión, lo que significa que puede fallar cualqueir otra cosa en cualquier momento. La forma de asegurarse de que todo funciona bien es pasando la suite completa de tests de OpenXava contra WebLogic + Liferay.
Por cierto, ¿al final del execute.jsp tienes puesto lo siguiente?:
Realmente se está perdiendo todo el contexto, no solo el tab.
Esto pasa al hacer una llamada por segunda vez en el módulo cuando se llama a execute.jsp desde Module, en vez de en el PortletXava a través de portlet.jsp y module.jsp.
En el execute.jsp instancia un nuevo context y al no haber en el contexto xava_view ni xava_tab se instancian una nueva vista y un nuevo tab.
No se si podría estar relacionado de alguna forma con el problema con liferay que se menciona en portlet.jsp
Calling directly to module.jsp does not work well in liferay (at least until 4.1.3)
because the parameter sent from the portlet to the jsp are frozen for all the next
JSP calls.
Gracias por tu ayuda Javier, un saludo.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
no me has respondido a la pregunta que te hice: "¿al final del execute.jsp tienes puesto lo siguiente?: "
context.put(request,"xava_tab",tab);
No se si podría estar relacionado de alguna forma con el problema con liferay
No, porque eso tiene que ver con los parametros que se envian desde el portlet a los jsp, pero no a los que se envían entre los propios jsp. Además, el problema es que los objetos de sesión.
El problema lo tengo cuando llamo al execute.jsp desde Module.java no a través de module.jsp en XavaPortlet. La prueba que me comentas debería afectar
a las posteriores llamadas desde Module.java?
Un saludo.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Creo que me he equivocado y pense que no me habías entendido, pero al ser la llamada mediante dwr tiene sentido la prueba que me proponías.
Todavía no he podido probarlo, desgraciadamente estoy teniendo serios problemas con mi entorno weblogic para poder hacer las pruebas.
Hasta ahora he podido ver que dentro del execute.jsp se pierde el context, pero que puedo hacer un put a la sesión del context con otro nombre (mi_context).
Hasta ahora he podido ver que dentro del execute.jsp se pierde el context
¿Sabes en que punto se pierder?
Esto quizás me permita asignarselo al context de execute.jsp cuando detecte que este se ha perdido
Si funciona es una buena opción, porque en el context está todo el estado del módulo. Yo todavía me pregunto porque se pierde.
Si pudieramos hacer un portlet y un servlet simple (sin nada de OX) que intenten compartir el estado de la sesión y fallen, podriamos dar de alta un bug en Liferay con este caso.
¿Has probado con la última versión de Liferay? O con el último nivel de parches de la versión que utilizas
¿Has probado con la última versión de WebLogic? O con el último nivel de parches de la versión que utilizas
¿No has encontrado ningún bug en los trackers de estos proyectos que tenga que ver con nuestro problema?
¿Has probado con la última versión de Liferay? O con el último nivel de parches de la versión que utilizas
¿Has probado con la última versión de WebLogic? O con el último nivel de parches de la versión que utilizas
He probado con actualizando y con nuevas versiones, pero el resultado es siempre el mismo.
Tocat + Liferay funciona.
La diferencia radica en que con weblogic en la llamada dwr no aparece nada en el httpsessionid.
¿No has encontrado ningún bug en los trackers de estos proyectos que tenga que ver con nuestro problema?
Desgraciadamente no he podido encontrar nada que pueda ayudar.
Funciona parcialmente si cambio de posición el el execute.jsp el context.put(request,"xava_tab",tab);
Puedo cambiar entre los modos de vista, pero no funciona SaveAction que parece que pierde los datos.
Imposible modificar: no existe un registro con esa clave
context.put(request,"xava_tab",tab);
manager.initModule(request, errors, messages);
manager.executeOnEachRequestActions(request, errors, messages);
if (hasProcessRequest) {
manager.execute(request, errors, messages);
if (manager.isListMode()) { // here and before execute the action
tab.setModelName(manager.getModelName());
if (tab.getTabName() == null) {
tab.setTabName(manager.getTabName());
}
}
}
//after-each-request
manager.executeAfterEachRequestActions(request, errors, messages);
Esto lleva a pensar que de la 4m1 a la versión actual a cambiado algo en el flujo que se sigue para realizar la acción
y que hay otro punto en este flujo en el que necesitaría hacer de nuevo el put para resolver el problema.
¿Sabes en que punto se pierde?
Cuando hago un getSession.getAttribute("context");
Aunque yo meta un context_auxiliar a la sesión al recuperarlo sus valores quedan a null.
Parece ser que lo que hace es una desserialización. Los atributos de la clase ModuleContext son transient (Map contexts y Map globalContext),
cuando se deserializa estos pasan a valer null de nuevo. He visto que en la versión 4m1 no están como transient.
He probado a dejarlos sin ser transient y funciona esa parte, puedo pasar al modo detalle pero no volver al modo lista.
El fallo da porque no puede recuperar "tabObject" de la request.
Curiosamente en el execute.jsp se hace lo siguiente
tab.setRequest(request);
y request es transient en la clase org.openxava.tab.Tab, hay mas atributos transient y
me preocupa que pueda afectar al comportamiento del resto de la aplicación si lo cambio.
Muchas gracias por tu ayuda Javier.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
He probado a aunar las dos modificaciones, el put y quitando los atributos transient.
De esta manera funciona, pero si la clase contiene también una collection aparece una
Excepción diciendome que no se puede desserializar MetaUseObject. La he hecho serializable, pero no se si necesitaré que alguna clase más sea serializable.
public class MetaUseObject implements java.io.Serializable{
private String name;
private String actionProperty;
public String getName() {
return name;
}
/**
* If is not set it assumes the object name without prefix. <p>
*
* For example, if the name is 'view' it assumes 'view' and
* if it's 'xava_view' it assumes 'view'.
*/
public String getActionProperty() {
if (!Is.emptyString(actionProperty)) return actionProperty;
if (name==null) return "";
int dotIdx = name.indexOf('_');
if (dotIdx >= 0) {
return name.substring(dotIdx+1);
}
else {
return name;
}
}
public void setName(String string) {
name = string;
}
public void setActionProperty(String string) {
actionProperty = string;
}
Llegado a este punto se reproducen dos problemas más, relacionados con la perdida de valores, me preocupa
que pueda pasar en más puntos, una vez salvados estos:
1- La edición de registros de la colección no funciona. Se abre la ventana pero esta vacia y al cerrarla
se pierden los valores de la colección. De nuevo parece que se estan perdiendo valores, en este caso de la vista
2011-06-09 11:40:00,250 | ERROR | DWRBase:120 |
java.lang.NullPointerException
at org.openxava.view.View.getRequest(View.java:2924)
at org.openxava.view.View.getRequest(View.java:2924)
at org.openxava.view.View.getLabelFor(View.java:3657)
at jsp_servlet._web_45_inf._jsp._xava.__editor._jspService(__editor.java:188)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:524)
at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:444)
at weblogic.servlet.jsp.PageContextImpl.include(PageContextImpl.java:163)
at jsp_servlet._web_45_inf._jsp._xava.__detail._jspService(__detail.java:484)
2- Conversión de Boolean al intentar cargar datos en un tab, porque intenta hacer una conversión de Boolean utilizando
HibernateTypeConverter y el type es null en la Metapropety.
La excepción que aparece en el log es esta:
2011-06-08 13:27:20,859 | ERROR | HibernateTypeConverter:45 | Problema convirtiendo tipo de dato usando el Type de Hibernate null
java.lang.NullPointerException
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.openxava.converters.typeadapters.HibernateTypeBaseConverter.getHibernateType(HibernateTypeBaseConverter.java:22)
at org.openxava.converters.typeadapters.HibernateTypeConverter.toJava(HibernateTypeConverter.java:27)
at org.openxava.tab.impl.EntityTabDataProvider.doConversions(EntityTabDataProvider.java:195)
at org.openxava.tab.impl.EntityTabDataProvider.nextChunk(EntityTabDataProvider.java:49)
at org.openxava.tab.impl.EntityTab.nextChunk(EntityTab.java:303)
at org.openxava.tab.impl.TableModelBean.getRow(TableModelBean.java:121)
at org.openxava.tab.impl.TableModelBean.getObjectAt(TableModelBean.java:150)
at org.openxava.tab.impl.XTableModelDecoratorBase.getObjectAt(XTableModelDecoratorBase.java:55)
at es.gv.pca.ox.actions.EditElementInCollectionAction.execute(EditElementInCollectionAction.java:42)
La request es transient en la clase org.openxava.view.View, así que supongo que se este deserializando la clase View
Sí, pero siempre se debería de trabajar con un request fresquito, y no se debería guardar el request nunca entre petición, y petición. Así que esto sí que es un bug de OX que podemos arreglar.
Añádelo como bug y pon, por favor, la traza completa y los pasos que has de dar para que falle.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Conversión de Boolean al intentar cargar datos en un tab, porque intenta hacer una conversión de Boolean utilizando HibernateTypeConverter y el type es null en la Metapropety
¿Falla sólo con esa propiedad o falla con todas?
¿Las otras propiedades de esa MetaProperty tienen valor?
Por cierto, ¿lo has probado ya con versiones más actuales de Liferay y WebLogic?
Prueba también probar tu aplicación de ejemplo usando OX3.0.3 (que no usaba AJAX), ¿te funciona?
¿Falla sólo con esa propiedad o falla con todas?
¿Las otras propiedades de esa MetaProperty tienen valor?
Aparentemente sólo se pierde ese atributo, pero me resulta imposible asegurarlo cien por cien, puesto que no es fácil
saber si los valores que tienen los atributos son por defecto o si son correctos o si en ese momento no tienen porque
tener valor.
Fuerzo el converter BoleanSNMediante debug y así consigo continuar interactuando con el sistema. Consigo ver la tabla de la collección,
pero ahora falla al intentar editar uno de los objetos de la collección.
Retomanto el tema de el transient y la request, me he dado cuenta de que la request de view tiene que ser transient ya que si no,
se producirían referencias circulares. View contiene a request, pero request contiene a view, también pasa lo mismo con los tab.
Pense en trucar la deserialización de View para que la request siga siendo transient pero serialicemos algo el lugar de esa request
que luego al deserializar pusieramos en la request, pero para mi hay demasiadas dependencias como para poder saber que objetos tendría que serializar.
Habría que asegurarse que estos objetos fueran frescos como planteabas con la request. Cómo asegurarse que son frescos?
Incluyo la traza completa del error.
2011-06-10 14:17:13,796 | ERROR | DWRBase:120 |
java.lang.NullPointerException
at org.openxava.view.View.getRequest(View.java:2924)
at org.openxava.view.View.getRequest(View.java:2924)
at org.openxava.view.View.getLabelFor(View.java:3657)
at jsp_servlet._web_45_inf._jsp._xava.__editor._jspService(__editor.java:188)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:524)
at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:444)
at weblogic.servlet.jsp.PageContextImpl.include(PageContextImpl.java:163)
at jsp_servlet._web_45_inf._jsp._xava.__detail._jspService(__detail.java:484)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:524)
at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:444)
at weblogic.servlet.jsp.PageContextImpl.include(PageContextImpl.java:163)
at jsp_servlet._web_45_inf._jsp._xava.__core._jspService(__core.java:426)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:524)
at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253)
at org.openxava.web.servlets.Servlets.getURIAsString(Servlets.java:120)
at org.openxava.web.servlets.Servlets.getURIAsString(Servlets.java:99)
at org.openxava.web.dwr.Module.getURIAsString(Module.java:205)
at org.openxava.web.dwr.Module.fillResult(Module.java:215)
at org.openxava.web.dwr.Module.request(Module.java:101)
at sun.reflect.GeneratedMethodAccessor719.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at es.gv.pca.ox.filters.LocaleFilter.doFilterInternal(LocaleFilter.java:78)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:176)
Por cierto, ¿lo has probado ya con versiones más actuales de Liferay y WebLogic?
La pruebas que hemos hecho hasta ahora han sido tanto con nuestros entornos naturales de trabajo con actualizaciones y nuevas
versiones de ellos.
Prueba también probar tu aplicación de ejemplo usando OX3.0.3 (que no usaba AJAX), ¿te funciona?
No he podido probar todavía, pero el problema se reproduce migrando de la 4m1 a la versión actual, así que en principio no debería afectar la utilización de Ajax.
Tendría sentido probar con boolean coreViaAJAX = false; en module.jsp
Han cambiado tantas cosas de una versión a otra con respecto a atributos transient y clases serializables, así como su flujo como para que Openxava deje de funcionar en un entorno con serialización?
Gracias Javier y un saludo
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Dado que los request son transient en View y Tab, cada vez que da una NullPointerException, es que hemos fallado al asignar el request actual.
Deberías sacar por el log el request que recibe el método request() de la clase Module, y después visualizarlos en Tab y View siempre que se usen. En el momento que no coincidan hemos encontrado un caso en que no se asigna el request fresco.
Tendría sentido probar con boolean coreViaAJAX = false; en module.jsp
Bueno, funciona así por defecto. Lo que podemos probar es coreViaAJAX = true.
Primero agradecerte los consejos que nos has indicado,
Segundo por desgracia adelantarte que vemos imposible modificar lo suficiente OpenXava 4.1.2 para que tenga un comportamiento normal en Weblogic 10.3.4 (esta versión es la que necesita porque incorpora soporte a JPA 2) con Liferays ni 5.1.2 ni 6.0.6
Por esta razón, entiendo la incompatibilidad de estos tres entornos: Openxava 4.1.2 + Weblogic 10.3.X+ Liferay - ni 5.1.2 ni 6.0.6 - Y es la mezcla de los tres porque.
* liferay + tomcat + nuestra app ox formato porlet funciona ok
* weblogic + nuestra app ox formato app funciona ok
Es curioso que Openxava 4m1 si funcionaba (con los retoques relacionados con parámetros), por eso no comprendíamos que fallase en 4.1.2 pero debe estar muy relacionado con todos los cambios relacionados con la serialización ya que: pierde contexto, pierde parámetros, etc. que hacen en las ejecuciones que el comportamiento no sea normal.
Me gustaría preguntarte tres cosas, ya abusando de confianza:
* ¿ tu crees que tiene solución este problema o directamente abandonamos la posibilidad. ?
* Openxava 4.1.2 es viable desplegándolo como aplicación en Weblogic (no como porlet), éste funciona correctamente (sin Liferay por medio) ¿ves viable hacerse un login y menu dentro del propio war del proyecto OpenXava o esto por arquitectura es inviable?
Sinceramente a pesar del temporal que estamos sufriendo creo que OpenXava es un gran framework pero este problema se está convirtiendo en un full-stopper porque comprendemos que Weblogic con un Liferay es un escenario típico en un entorno J2EE
Saludos y de nuevo mil gracias por prestarnos ayuda.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
¿ tu crees que tiene solución este problema o directamente abandonamos la posibilidad. ?
Yo creo que tiene solución, estás cosas suelen funcionar, pero a veces hay que sufrir mucho, y tener suerte. Después de hacer que las aplicaciones OpenXava funcionen en un WebSphere Portal sobre AS/400 creo que todo es posible.
Como allí digo no tengo localizado el código que resuelve el problema. Habría que volver a solucionarlo para la 4m1, y hacer una 4m1sp1 o algo así.
¿ves viable hacerse un login y menu dentro del propio war del proyecto OpenXava o esto por arquitectura es inviable?
Es totalmente viable. De hecho, parte de la comunidad OpenXava lo hace así.
comprendemos que Weblogic con un Liferay es un escenario típico
Sí, yo a veces me he encontrado con casos de esos en lo que piensas que es imposible que cosas tan básicas fallen, y lo hacen, y te dices a tí mismo: ¿Habré sido yo el primero en llegar aquí? Aunque en este caso hay esperanza, porque OX4m1 funciona, así que es posible.
se está convirtiendo en un full-stopper
Bueno como ya te he comentado siempre tienes la opción de la ayuda profesional, tanto para arreglar el bug en OX4m1 como para hacer que OX4.2.x funcione en weblogic + liferay.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola.
Tengo el siguiente problema:
Cuando estoy en modo lista y teniendo la tabla registros, si me quiero pasar al modo detalle me aparece el mensaje:
Imposible ir a modo detalle, no hay elementos en la lista.
Además me muestra una excepción porque el tab es null. Es como si perdiera la referencia a la vista.
Lo he probado en Tomcat y en Weblogic fuera del portal y en estos casos si funciona correctamente.
Estoy utilizando Liferay 5.2.3
Adjuto la clase y la traza de la excepción por si puede dar alguna pista.
Un saludo y gracias por adelantado.
@Entity
@Table(name = "COMERCIO")
public class Comercio implements java.io.Serializable {
private long idcomercio;
private String comercio;
public Comercio() {
}
@Id
@Column(name = "IDCOMERCIO", unique = true, nullable = false, precision = 18, scale = 0)
public long getIdcomercio() {
return this.idcomercio;
}
public void setIdcomercio(long idcomercio) {
this.idcomercio = idcomercio;
}
@Column(name = "COMERCIO", nullable = false, length = 12)
public String getcomercio() {
return this.comercio;
}
public void setcomercio(String comercio) {
this.comercio = comercio;
}
}
2011-06-01 09:13:03,578 | ERROR | Tab:331 |
java.lang.NullPointerException
at org.openxava.component.MetaComponent.get(MetaComponent.java:57)
at org.openxava.tab.Tab.getMetaTab(Tab.java:237)
at org.openxava.tab.Tab.createTableModel(Tab.java:347)
at org.openxava.tab.Tab.getTableModel(Tab.java:328)
at org.openxava.tab.Tab.getTotalSize(Tab.java:921)
at org.openxava.actions.GoDetailAction.execute(GoDetailAction.java:27)
at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:379)
at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:296)
at org.openxava.controller.ModuleManager.execute(ModuleManager.java:256)
at jsp_servlet._web_45_inf._jsp._xava.__execute._jspService(__execute.java:200)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:524)
at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:444)
at org.openxava.web.servlets.Servlets.getURIAsStream(Servlets.java:66)
at org.openxava.web.dwr.Module.getURIAsStream(Module.java:183)
at org.openxava.web.dwr.Module.request(Module.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at es.gv.pca.ox.filters.LocaleFilter.doFilterInternal(LocaleFilter.java:78)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:176)
2011-06-01 09:13:03,578 | WARN | Tab:924 | ¡ADVERTENCIA! Imposible obtener el tamaño total de un tab
java.lang.NullPointerException
at org.openxava.component.MetaComponent.get(MetaComponent.java:57)
at org.openxava.tab.Tab.getMetaTab(Tab.java:237)
at org.openxava.tab.Tab.cloneMetaTab(Tab.java:230)
at org.openxava.tab.Tab.restoreDefaultProperties(Tab.java:1243)
at org.openxava.tab.Tab.getTableModel(Tab.java:332)
at org.openxava.tab.Tab.getTotalSize(Tab.java:921)
at org.openxava.actions.GoDetailAction.execute(GoDetailAction.java:27)
at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:379)
at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:296)
at org.openxava.controller.ModuleManager.execute(ModuleManager.java:256)
at jsp_servlet._web_45_inf._jsp._xava.__execute._jspService(__execute.java:200)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:165)
at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:105)
at com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:78)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:70)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:524)
at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:444)
at org.openxava.web.servlets.Servlets.getURIAsStream(Servlets.java:66)
at org.openxava.web.dwr.Module.getURIAsStream(Module.java:183)
at org.openxava.web.dwr.Module.request(Module.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at es.gv.pca.ox.filters.LocaleFilter.doFilterInternal(LocaleFilter.java:78)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:207)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:176)
Hola Alejandro,
este problema es muy extraño para mí. Es como si el objeto tab desapareciera mágicamente de la sesión. Investiga en la documentación y foros sobre weblogic + liferay para ver si encuentras algún problema parecido. Si no tendremos que depurar hasta averiguar que es lo que está pasando. Lo que más me preocupa es que si el objeto xava_tab desaparece, también le puede pasar lo mismo a otros objetos de sesión, lo que significa que puede fallar cualqueir otra cosa en cualquier momento. La forma de asegurarse de que todo funciona bien es pasando la suite completa de tests de OpenXava contra WebLogic + Liferay.
Por cierto, ¿al final del execute.jsp tienes puesto lo siguiente?:
Aprende OpenXava con ejemplos: Consigue el libro
Hola Javier.
Realmente se está perdiendo todo el contexto, no solo el tab.
Esto pasa al hacer una llamada por segunda vez en el módulo cuando se llama a execute.jsp desde Module, en vez de en el PortletXava a través de portlet.jsp y module.jsp.
getURIAsStream("execute.jsp", values, multipleValues, selected, additionalParameters);
En el execute.jsp instancia un nuevo context y al no haber en el contexto xava_view ni xava_tab se instancian una nueva vista y un nuevo tab.
No se si podría estar relacionado de alguna forma con el problema con liferay que se menciona en portlet.jsp
Calling directly to module.jsp does not work well in liferay (at least until 4.1.3)
because the parameter sent from the portlet to the jsp are frozen for all the next
JSP calls.
Gracias por tu ayuda Javier, un saludo.
Hola Alejandro,
no me has respondido a la pregunta que te hice: "¿al final del execute.jsp tienes puesto lo siguiente?: "
No, porque eso tiene que ver con los parametros que se envian desde el portlet a los jsp, pero no a los que se envían entre los propios jsp. Además, el problema es que los objetos de sesión.
Prueba cambiar en module.jsp, lo siguiente
por
y dime que tal va.
Aprende OpenXava con ejemplos: Consigue el libro
Hola Javier.
En el código tengo esa línea.
context.put(request,"xava_tab",tab);
El problema lo tengo cuando llamo al execute.jsp desde Module.java no a través de module.jsp en XavaPortlet. La prueba que me comentas debería afectar
a las posteriores llamadas desde Module.java?
Un saludo.
Hola de nuevo Javier.
Disculpa el bombardeo de mensajes.
Creo que me he equivocado y pense que no me habías entendido, pero al ser la llamada mediante dwr tiene sentido la prueba que me proponías.
Todavía no he podido probarlo, desgraciadamente estoy teniendo serios problemas con mi entorno weblogic para poder hacer las pruebas.
Hasta ahora he podido ver que dentro del execute.jsp se pierde el context, pero que puedo hacer un put a la sesión del context con otro nombre (mi_context).
Module.java:
.
.
.
request.getSession().setAttribute("MI_CONTEXT", getContext(request));
getURIAsStream("execute.jsp", values, multipleValues, selected, additionalParameters);
Esto quizás me permita asignarselo al context de execute.jsp cuando detecte que este se ha perdido. Aún así tu propuesta resultaría mas sencilla.
execute.jsp
.
.
.
<%
String browser = (String) request.getAttribute("xava.portlet.user-agent");
if (browser == null) {
browser = request.getHeader("user-agent");
request.setAttribute("xava.portlet.user-agent", browser);
}
Locales.setCurrent(request);
org.openxava.controller.ModuleManager manager = (org.openxava.controller.ModuleManager) context.get(request, "manager", "org.openxava.controller.ModuleManager");
manager.setSession(session);
manager.resetPersistence();
org.openxava.tab.Tab t = (org.openxava.tab.Tab) context.get(request, "xava_tab");
if (null == t.getModelName()) {
context=(org.openxava.controller.ModuleContext)request.getSession().getAttribute("MI_CONTEXT");
manager = (org.openxava.controller.ModuleManager) context.get(request, "manager", "org.openxava.controller.ModuleManager");
manager.setSession(session);
manager.resetPersistence();
t = (org.openxava.tab.Tab) context.get(request, "xava_tab");
}
Un saludo y muchas gracias por tu ayuda.
Hola Alejandro,
¿Sabes en que punto se pierder?
¿Has probado con la última versión de Liferay? O con el último nivel de parches de la versión que utilizas
¿Has probado con la última versión de WebLogic? O con el último nivel de parches de la versión que utilizas
¿No has encontrado ningún bug en los trackers de estos proyectos que tenga que ver con nuestro problema?
Aprende OpenXava con ejemplos: Consigue el libro
Hola Javier.
He probado con actualizando y con nuevas versiones, pero el resultado es siempre el mismo.
Tocat + Liferay funciona.
La diferencia radica en que con weblogic en la llamada dwr no aparece nada en el httpsessionid.
Weblogic + 4m1 o 4.12 funciona
Weblogic + 4m1 + 5.1.2 funciona
Desgraciadamente no he podido encontrar nada que pueda ayudar.
Funciona parcialmente si cambio de posición el el execute.jsp el context.put(request,"xava_tab",tab);
Puedo cambiar entre los modos de vista, pero no funciona SaveAction que parece que pierde los datos.
Imposible modificar: no existe un registro con esa clave
Esto lleva a pensar que de la 4m1 a la versión actual a cambiado algo en el flujo que se sigue para realizar la acción
y que hay otro punto en este flujo en el que necesitaría hacer de nuevo el put para resolver el problema.
Cuando hago un getSession.getAttribute("context");
Aunque yo meta un context_auxiliar a la sesión al recuperarlo sus valores quedan a null.
Parece ser que lo que hace es una desserialización. Los atributos de la clase ModuleContext son transient (Map contexts y Map globalContext),
cuando se deserializa estos pasan a valer null de nuevo. He visto que en la versión 4m1 no están como transient.
He probado a dejarlos sin ser transient y funciona esa parte, puedo pasar al modo detalle pero no volver al modo lista.
El fallo da porque no puede recuperar "tabObject" de la request.
Curiosamente en el execute.jsp se hace lo siguiente
y request es transient en la clase org.openxava.tab.Tab, hay mas atributos transient y
me preocupa que pueda afectar al comportamiento del resto de la aplicación si lo cambio.
Muchas gracias por tu ayuda Javier.
Hola Javier.
He probado a aunar las dos modificaciones, el put y quitando los atributos transient.
De esta manera funciona, pero si la clase contiene también una collection aparece una
Excepción diciendome que no se puede desserializar MetaUseObject. La he hecho serializable, pero no se si necesitaré que alguna clase más sea serializable.
Llegado a este punto se reproducen dos problemas más, relacionados con la perdida de valores, me preocupa
que pueda pasar en más puntos, una vez salvados estos:
1- La edición de registros de la colección no funciona. Se abre la ventana pero esta vacia y al cerrarla
se pierden los valores de la colección. De nuevo parece que se estan perdiendo valores, en este caso de la vista
2- Conversión de Boolean al intentar cargar datos en un tab, porque intenta hacer una conversión de Boolean utilizando
HibernateTypeConverter y el type es null en la Metapropety.
La excepción que aparece en el log es esta:
El código de esa propiedad es el siguiente:
He probado, sin exito a poner en el default-converters lo siguiente:
Gracias por tu ayuda, un saludo.
Hola de nuevo Javier.
Un detalle más, con respecto al problema 1- La edición de registros de la colección no funciona.
La request es transient en la clase org.openxava.view.View, así que supongo que se este deserializando la clase View y pierda ahí la request.
Hola Alejandro,
Sí, pero siempre se debería de trabajar con un request fresquito, y no se debería guardar el request nunca entre petición, y petición. Así que esto sí que es un bug de OX que podemos arreglar.
Añádelo como bug y pon, por favor, la traza completa y los pasos que has de dar para que falle.
Hola Alejandro,
¿Falla sólo con esa propiedad o falla con todas?
¿Las otras propiedades de esa MetaProperty tienen valor?
Por cierto, ¿lo has probado ya con versiones más actuales de Liferay y WebLogic?
Prueba también probar tu aplicación de ejemplo usando OX3.0.3 (que no usaba AJAX), ¿te funciona?
Aprende OpenXava con ejemplos: Consigue el libro
Hola Javier.
Aparentemente sólo se pierde ese atributo, pero me resulta imposible asegurarlo cien por cien, puesto que no es fácil
saber si los valores que tienen los atributos son por defecto o si son correctos o si en ese momento no tienen porque
tener valor.
Fuerzo el converter BoleanSNMediante debug y así consigo continuar interactuando con el sistema. Consigo ver la tabla de la collección,
pero ahora falla al intentar editar uno de los objetos de la collección.
Retomanto el tema de el transient y la request, me he dado cuenta de que la request de view tiene que ser transient ya que si no,
se producirían referencias circulares. View contiene a request, pero request contiene a view, también pasa lo mismo con los tab.
Pense en trucar la deserialización de View para que la request siga siendo transient pero serialicemos algo el lugar de esa request
que luego al deserializar pusieramos en la request, pero para mi hay demasiadas dependencias como para poder saber que objetos tendría que serializar.
Habría que asegurarse que estos objetos fueran frescos como planteabas con la request. Cómo asegurarse que son frescos?
Incluyo la traza completa del error.
La pruebas que hemos hecho hasta ahora han sido tanto con nuestros entornos naturales de trabajo con actualizaciones y nuevas
versiones de ellos.
No he podido probar todavía, pero el problema se reproduce migrando de la 4m1 a la versión actual, así que en principio no debería afectar la utilización de Ajax.
Tendría sentido probar con boolean coreViaAJAX = false; en module.jsp
Han cambiado tantas cosas de una versión a otra con respecto a atributos transient y clases serializables, así como su flujo como para que Openxava deje de funcionar en un entorno con serialización?
Gracias Javier y un saludo
Hola Alejandro,
Dado que los request son transient en View y Tab, cada vez que da una NullPointerException, es que hemos fallado al asignar el request actual.
Deberías sacar por el log el request que recibe el método request() de la clase Module, y después visualizarlos en Tab y View siempre que se usen. En el momento que no coincidan hemos encontrado un caso en que no se asigna el request fresco.
Bueno, funciona así por defecto. Lo que podemos probar es coreViaAJAX = true.
Aprende OpenXava con ejemplos: Consigue el libro
Hola Javier,
Primero agradecerte los consejos que nos has indicado,
Segundo por desgracia adelantarte que vemos imposible modificar lo suficiente OpenXava 4.1.2 para que tenga un comportamiento normal en Weblogic 10.3.4 (esta versión es la que necesita porque incorpora soporte a JPA 2) con Liferays ni 5.1.2 ni 6.0.6
Por esta razón, entiendo la incompatibilidad de estos tres entornos: Openxava 4.1.2 + Weblogic 10.3.X+ Liferay - ni 5.1.2 ni 6.0.6 - Y es la mezcla de los tres porque.
* liferay + tomcat + nuestra app ox formato porlet funciona ok
* weblogic + nuestra app ox formato app funciona ok
Es curioso que Openxava 4m1 si funcionaba (con los retoques relacionados con parámetros), por eso no comprendíamos que fallase en 4.1.2 pero debe estar muy relacionado con todos los cambios relacionados con la serialización ya que: pierde contexto, pierde parámetros, etc. que hacen en las ejecuciones que el comportamiento no sea normal.
Me gustaría preguntarte tres cosas, ya abusando de confianza:
* ¿ tu crees que tiene solución este problema o directamente abandonamos la posibilidad. ?
* Como solucionar un problema que tenemos importantillo con la 4m1 solucionado en la 4.1.2 y anteriores que te indicamos en https://sourceforge.net/projects/openxava/forums/forum/437013/topic/4474595?message=9907874 Si solucionamos esto quizá podemos seguir con la 4m1 durante un tiempo
* Openxava 4.1.2 es viable desplegándolo como aplicación en Weblogic (no como porlet), éste funciona correctamente (sin Liferay por medio) ¿ves viable hacerse un login y menu dentro del propio war del proyecto OpenXava o esto por arquitectura es inviable?
Sinceramente a pesar del temporal que estamos sufriendo creo que OpenXava es un gran framework pero este problema se está convirtiendo en un full-stopper porque comprendemos que Weblogic con un Liferay es un escenario típico en un entorno J2EE
Saludos y de nuevo mil gracias por prestarnos ayuda.
Hola Donkelito,
Yo creo que tiene solución, estás cosas suelen funcionar, pero a veces hay que sufrir mucho, y tener suerte. Después de hacer que las aplicaciones OpenXava funcionen en un WebSphere Portal sobre AS/400 creo que todo es posible.
Como allí digo no tengo localizado el código que resuelve el problema. Habría que volver a solucionarlo para la 4m1, y hacer una 4m1sp1 o algo así.
Es totalmente viable. De hecho, parte de la comunidad OpenXava lo hace así.
Sí, yo a veces me he encontrado con casos de esos en lo que piensas que es imposible que cosas tan básicas fallen, y lo hacen, y te dices a tí mismo: ¿Habré sido yo el primero en llegar aquí? Aunque en este caso hay esperanza, porque OX4m1 funciona, así que es posible.
Bueno como ya te he comentado siempre tienes la opción de la ayuda profesional, tanto para arreglar el bug en OX4m1 como para hacer que OX4.2.x funcione en weblogic + liferay.