Dispongo de una página JSP que carga datos de la organización principal, pero cuando paso de organización (esquema), se siguen presentado los datos de la organización principal.
¿Cómo hago para que se tenga en cuenta la organización en la que se está?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
¿Cómo cargas esos datos?
¿Donde defines tu página JSP?
Si tu página JSP es una vista-web de tu módulo y usas JPA para obtener los datos debería funcionar de forma automática. Ahora bien, si es una JSP que se llama directamente escribiendo la URL en el navegador, u obtienes los datos de otra manera. No funcionará, claro.
Dame más detalles, como la definición del módulo que usa la JSP y el contenido de la misma.
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
La página JSP presenta el calendario con el combo para seleccionar técnicos que te pego en adjuntos.
El combo se rellena con el nombre de técnicos haciendo una llamada a un módulo llamado "EventoFichajeCalendario" a la función "findAllUsersForContrato".
Esta es la llamada que hago en la JSP, en el body
<select name="entidad_selector" id="entidad_selector" onchange="this.form.submit()">
<option value="-1"> Seleccione empleado... </option>
<% //cargar el combo con los empleados y marcar el que viene seleccionado
//04012024 - sacar tecnicos con usuario enlazado, en activo y con contrato Nomina Elenco (NE)
List<Tecnico> empleados = EventoFichajeCalendario.findAllUsersForContrato("NE");
String sTagSelected = "";
String usuario = "";
String nombre = "";
String apellidos = "";
if (empleados != null) {
for (Tecnico empl : empleados) {
if (idSelected != null){
if (idSelected.equalsIgnoreCase(empl.getUsuario().getName())) {
sTagSelected="selected";
} else {
sTagSelected="";
}
}
if (empl.getNombre() != null) nombre = empl.getNombre();
//if (empl.getApellidos() != null) apellidos = empl.getApellidos();
%>
<option <%=sTagSelected%> value="<%=empl.getUsuario().getName()%>"><%=nombre + " " + apellidos%></option>
<%
}
}
%>
</select>
y esta la función del módulo java al que llamo
ublic static List<Tecnico> findAllUsersForContrato(String idContrato) {
LOG.debug(Util.userLog() + "---idContrato:" + (idContrato==null?"null":idContrato));
if (idContrato==null) return null;
String trama = null;
try {
Empleado empleadoActual = Empleado.findByUser(null, Users.getCurrent());
trama = "FROM Tecnico "
+ "WHERE usuario IS NOT NULL "
+ "AND nombre IS NOT NULL "
+ "AND activo = true "
+ "AND keyCode.idCompany = '" + empleadoActual.getKeyCode().getIdCompany() + "' "
+ "AND tipoContrato.codigo = '" + idContrato + "' "
+ "ORDER BY nombre ASC";
} catch (Exception e) { //admin no es empleado, para poder correr la sql
trama = "FROM Tecnico "
+ "WHERE usuario IS NOT NULL "
+ "AND nombre IS NOT NULL "
+ "AND activo = true "
+ "AND tipoContrato.codigo = '" + idContrato + "' "
+ "ORDER BY nombre ASC";
}
List<Tecnico> tecnicos = XPersistence.getManager().createQuery(trama).getResultList();
return tecnicos;
}
En ningún momento estoy seleccionando contra que esquema quiero ir y siempre se lanza contra el esquema principal.
He adjuntado el módulo .java y la imagen del calendario que carga la página JSP.</select>
El código está bien, debería funcionar. Usas XPersistence.getManager() como el resto del JSP que se ejecuta antes y después. Además, estás dentro de un módulo.
¿Que secuencia de pasos haces? Es decir, entras en una organización, salen sus empleados en el combo, entras en otras, y se ven los empleados de la primera. ¿Es eso?
¿Me puedes mostrar también la URL en el navegador?
Activa el show_sql en el persistence.xml y dime que SQL se ejecutan.
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
¿Que secuencia de pasos haces? Es decir, entras en una organización, salen sus empleados en el combo, entras en otras, y se ven los empleados de la primera. ¿Es eso?
Eso es.
Activa el show_sql en el persistence.xml y dime que SQL se ejecutan.
Salen un millón de líneas, para o engorronar, a ver si te sirve esto.
Mientras que me muevo por el resto de módulos, todas las sql apuntan a la segunda organización, pero cuando cambio a este JSP, y se lanzan las consultas, la organización de las consultas es la primera.
En estas sql es donde se produce el cambio. A partir de que se produce el cambio, al pulsar sobre los módulos normales, te echa de la aplicación para loguearte otra vez, como cuando no tienes permisos.
select modulerigh0_.roles_name as roles_na6_174_, modulerigh0_.modules_name as modules_7_174_, modulerigh0_.modules_application as modules_8_174_, modulerigh0_.excludedActions as excluded1_174_, modulerigh0_.excludedMembers as excluded2_174_, modulerigh0_.notInMenu as notinmen3_174_, modulerigh0_.readOnly as readonly4_174_, modulerigh0_.readOnlyMembers as readonly5_174_ from escaleno.OXROLES_OXMODULES modulerigh0_ where modulerigh0_.modules_application=? and modulerigh0_.modules_name=? and modulerigh0_.roles_name=?
Justo antes de lanzar las select de la página JSP, se llama bien al esquema de la base de datos. Después de que se han lanzado las select, cuando pulsas cualquier módulo, te echa de la aplicación a la pantalla de login.
Last edit: JOSE ELIAS 2024-05-18
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Creo que es, básicamente, lo que haces tú. Cada vez que entro a una organización el JSP me muestra los datos de esa organización. Lo he probado normal y con usuarios compartidos entre organizaciones. En ambos casos, haga lo que haga, funciona bien.
Te adjunto el zip con el proyecto. Pruébalo en tu máquina e intenta hacerlo fallar, cuando lo hayas conseguido dime la lista exacta de pasos que he de dar para que falle. Si no consigues que falle, modifícalo hasta que falle, y adjunta aquí el proyecto modificado.
Hola JP, así es como falla:
--No puedo usar vista-web directa a la jsp final porque no se carga, tengo que pasarla por un iframe. He pasado tu jsp por un iframe y falla también..
Buen, pues ya hemos descubierto el misterio. Con iframe no te va a funcionar.
Ten en cuenta que un iframe es como un navegador que está incrustado dentro de la página que abre otro sitio web, de forma totalmente independiente. Es decir, que el efecto es el de llamar desde la URL del navegador directamente a jsp-propios/mostrarMiLista.jsp. De esa forma, estás ejecutando directamente la página JSP sin pasar por nada de la lógica de OpenXava o XavaPro. No tienes definida la organización, pero tampoco el usuario actual, si haces XPersistence.getManager() se crea otro nuevo en otro hilo con otra transacción, sino cierras el manager con XPersistence.commit() va a tener una fuga de conexiones y saturarás el pool, etc.
Un iframe es como llamar directamente al JSP, lo que significa que te tienes que encargar de todo.
Si quieres seguir usando un iframe una opción sería que enviaras el esquema como argumento.
Otro problema del iframe es que para que funcione tienes que tener una JSP accesible directamente que ofrece datos de la aplicación, lo que supone un brecha de seguridad.
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hasta que encuentre una solución mejor que me permita usar vista-web voy a optar por pasar el esquema a la JSP.
Me ocurre que no soy capaz de recuperar el objeto de sesión en la página JSP.
Esta es la acción que pasa el esquema
public class MostrarHorasTecnico extends BaseAction implements INavigationAction {
private static final Logger LOG = Logger.getLogger(MostrarHorasTecnico.class);
Hola JP, haciéndo lo que me indicas, efectivamente se recupera el "elencoerp_defaultSchema" desde le primer JSP, pero haciendo exactamente lo mismo en el JSP que debe recuperar bien su valor, siempre llega el valor de inicialización en controladores.xml
La sensación es como si después de pasar por mostrarHorasTecnico.jsp se perdiera el valor inyectado a "elencoerp_defaultSchema" .
La sensación es como si después de pasar por mostrarHorasTecnico.jsp se perdiera el valor inyectado a "elencoerp_defaultSchema"
Claro que se pierde. Lo de @Inject es para objetos de sesión de OpenXava que son locales del módulo. En tu propio JSP ejecutado directamente, no tienes nada de OpenXava, ni siquiera módulo, ni usuario actual, ni va a cerrarte el manager, ni nada. Para que el JSP pueda usar todo lo disponible en OpenXava tiene que estar definido en vista-web y ser llamado desde el módulo.
Sí que puedes poner valores a la session de servlet con session.settAttribute() y después leerlos desde el JSP. Piensa también que un JSP así es un agujero de seguridad porque se puede llamar directamente desde la URL del navegador sin identificarte.
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Mientras encuentro uan solución, tengo el problema de que cada vez que se visualiza este JSP se tiene que volver a loguearse para poder usar otro módulo en la segunda organización (en la principal no pasa).
Puedo resolverlo de alguna manera?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Me explico.
Dispongo de una página JSP que carga datos de la organización principal, pero cuando paso de organización (esquema), se siguen presentado los datos de la organización principal.
¿Cómo hago para que se tenga en cuenta la organización en la que se está?
Hola José:
¿Cómo cargas esos datos?
¿Donde defines tu página JSP?
Si tu página JSP es una vista-web de tu módulo y usas JPA para obtener los datos debería funcionar de forma automática. Ahora bien, si es una JSP que se llama directamente escribiendo la URL en el navegador, u obtienes los datos de otra manera. No funcionará, claro.
Dame más detalles, como la definición del módulo que usa la JSP y el contenido de la misma.
Ayuda a otros en este foro como yo te ayudo a ti.
Hola JP...
La página JSP presenta el calendario con el combo para seleccionar técnicos que te pego en adjuntos.
El combo se rellena con el nombre de técnicos haciendo una llamada a un módulo llamado "EventoFichajeCalendario" a la función "findAllUsersForContrato".
Esta es la llamada que hago en la JSP, en el body
<select name="entidad_selector" id="entidad_selector" onchange="this.form.submit()"> <option value="-1"> Seleccione empleado... </option> <% //cargar el combo con los empleados y marcar el que viene seleccionado //04012024 - sacar tecnicos con usuario enlazado, en activo y con contrato Nomina Elenco (NE) List<Tecnico> empleados = EventoFichajeCalendario.findAllUsersForContrato("NE"); String sTagSelected = ""; String usuario = ""; String nombre = ""; String apellidos = ""; if (empleados != null) { for (Tecnico empl : empleados) { if (idSelected != null){ if (idSelected.equalsIgnoreCase(empl.getUsuario().getName())) { sTagSelected="selected"; } else { sTagSelected=""; } } if (empl.getNombre() != null) nombre = empl.getNombre(); //if (empl.getApellidos() != null) apellidos = empl.getApellidos(); %> <option <%=sTagSelected%> value="<%=empl.getUsuario().getName()%>"><%=nombre + " " + apellidos%></option> <% } } %> </select> y esta la función del módulo java al que llamo ublic static List<Tecnico> findAllUsersForContrato(String idContrato) { LOG.debug(Util.userLog() + "---idContrato:" + (idContrato==null?"null":idContrato)); if (idContrato==null) return null; String trama = null; try { Empleado empleadoActual = Empleado.findByUser(null, Users.getCurrent()); trama = "FROM Tecnico " + "WHERE usuario IS NOT NULL " + "AND nombre IS NOT NULL " + "AND activo = true " + "AND keyCode.idCompany = '" + empleadoActual.getKeyCode().getIdCompany() + "' " + "AND tipoContrato.codigo = '" + idContrato + "' " + "ORDER BY nombre ASC"; } catch (Exception e) { //admin no es empleado, para poder correr la sql trama = "FROM Tecnico " + "WHERE usuario IS NOT NULL " + "AND nombre IS NOT NULL " + "AND activo = true " + "AND tipoContrato.codigo = '" + idContrato + "' " + "ORDER BY nombre ASC"; } List<Tecnico> tecnicos = XPersistence.getManager().createQuery(trama).getResultList(); return tecnicos; } En ningún momento estoy seleccionando contra que esquema quiero ir y siempre se lanza contra el esquema principal. He adjuntado el módulo .java y la imagen del calendario que carga la página JSP.</select>
Last edit: JOSE ELIAS 2024-05-08
Hola José:
El código está bien, debería funcionar. Usas XPersistence.getManager() como el resto del JSP que se ejecuta antes y después. Además, estás dentro de un módulo.
¿Que secuencia de pasos haces? Es decir, entras en una organización, salen sus empleados en el combo, entras en otras, y se ven los empleados de la primera. ¿Es eso?
¿Me puedes mostrar también la URL en el navegador?
Activa el show_sql en el persistence.xml y dime que SQL se ejecutan.
Ayuda a otros en este foro como yo te ayudo a ti.
¿Que secuencia de pasos haces? Es decir, entras en una organización, salen sus empleados en el combo, entras en otras, y se ven los empleados de la primera. ¿Es eso?
Eso es.
¿Me puedes mostrar también la URL en el navegador?
https://xx.xx.xx.xx:xxx/ElencoERP/o/escaleno/m/HorasTecnico?init=true
Activa el show_sql en el persistence.xml y dime que SQL se ejecutan.
Salen un millón de líneas, para o engorronar, a ver si te sirve esto.
Mientras que me muevo por el resto de módulos, todas las sql apuntan a la segunda organización, pero cuando cambio a este JSP, y se lanzan las consultas, la organización de las consultas es la primera.
En estas sql es donde se produce el cambio. A partir de que se produce el cambio, al pulsar sobre los módulos normales, te echa de la aplicación para loguearte otra vez, como cuando no tienes permisos.
Hibernate:
Last edit: JOSE ELIAS 2024-05-16
Justo antes de lanzar las select de la página JSP, se llama bien al esquema de la base de datos. Después de que se han lanzado las select, cuando pulsas cualquier módulo, te echa de la aplicación a la pantalla de login.
Last edit: JOSE ELIAS 2024-05-18
Hola José:
He hecho un ejemplo de código intentando reproducir tu problema, pero no lo consigo. Siempre me funciona bien, haga lo que haga.
Este mi module en aplicacion.xml:
Este es mi JSP:
Y este mi método finder:
Creo que es, básicamente, lo que haces tú. Cada vez que entro a una organización el JSP me muestra los datos de esa organización. Lo he probado normal y con usuarios compartidos entre organizaciones. En ambos casos, haga lo que haga, funciona bien.
Te adjunto el zip con el proyecto. Pruébalo en tu máquina e intenta hacerlo fallar, cuando lo hayas conseguido dime la lista exacta de pasos que he de dar para que falle. Si no consigues que falle, modifícalo hasta que falle, y adjunta aquí el proyecto modificado.
Ayuda a otros en este foro como yo te ayudo a ti.
Last edit: Javier Paniza 2024-05-20
Hola JP, así es como falla:
--No puedo usar vista-web directa a la jsp final porque no se carga, tengo que pasarla por un iframe. He pasado tu jsp por un iframe y falla también..
Define así el módulo:
<modulo nombre="MiListaPersonalizada">
<modelo nombre="TuPrimeraEntidad">
<vista-web url="jsp-propios/mostrarMiLista.jsp">
<controlador-modo nombre="DetailOnly">
</controlador-modo></vista-web></modelo></modulo>
Define así mostrarMiLista.jsp
<iframe width="100%" height="1080" frameborder="0" ;="" src="/pruebas/jsp-propios/miLista.jsp"></iframe>Y deja miLista.jsp como tú la has definido.
Así cuando estas en la organización 2, saca los valores de la principal.
Hola José:
Buen, pues ya hemos descubierto el misterio. Con iframe no te va a funcionar.
Ten en cuenta que un iframe es como un navegador que está incrustado dentro de la página que abre otro sitio web, de forma totalmente independiente. Es decir, que el efecto es el de llamar desde la URL del navegador directamente a jsp-propios/mostrarMiLista.jsp. De esa forma, estás ejecutando directamente la página JSP sin pasar por nada de la lógica de OpenXava o XavaPro. No tienes definida la organización, pero tampoco el usuario actual, si haces XPersistence.getManager() se crea otro nuevo en otro hilo con otra transacción, sino cierras el manager con XPersistence.commit() va a tener una fuga de conexiones y saturarás el pool, etc.
Un iframe es como llamar directamente al JSP, lo que significa que te tienes que encargar de todo.
Si quieres seguir usando un iframe una opción sería que enviaras el esquema como argumento.
Otro problema del iframe es que para que funcione tienes que tener una JSP accesible directamente que ofrece datos de la aplicación, lo que supone un brecha de seguridad.
Ayuda a otros en este foro como yo te ayudo a ti.
Hasta que encuentre una solución mejor que me permita usar vista-web voy a optar por pasar el esquema a la JSP.
Me ocurre que no soy capaz de recuperar el objeto de sesión en la página JSP.
Esta es la acción que pasa el esquema
public class MostrarHorasTecnico extends BaseAction implements INavigationAction {
private static final Logger LOG = Logger.getLogger(MostrarHorasTecnico.class);
}
Este el objeto de sesión
<objeto nombre="elencoerp_defaultSchema" clase="java.lang.String" valor="" ambito="global"></objeto>
Y así intento recuperar en la página JSP
<jsp:usebean id="context" class="org.openxava.controller.ModuleContext" scope="session">
<%
String defaultSchema=(String)context.get(request, "elencoerp_defaultSchema");
%></jsp:usebean>
pero devuelve un error
org.openxava.util.XavaException: Es obligado que la petición contenga los parámetros ''application'' y ''module''
meto la aplicación y un módulo en context.get() y vuelvo a recibir otro mensaje en el que sobra un String
Last edit: JOSE ELIAS 2024-05-24
Hola José:
Cambia:
Por:
Ayuda a otros en este foro como yo te ayudo a ti.
Hola JP, haciéndo lo que me indicas, efectivamente se recupera el "elencoerp_defaultSchema" desde le primer JSP, pero haciendo exactamente lo mismo en el JSP que debe recuperar bien su valor, siempre llega el valor de inicialización en controladores.xml
La sensación es como si después de pasar por mostrarHorasTecnico.jsp se perdiera el valor inyectado a "elencoerp_defaultSchema" .
---> Este es mostrarHorasTecnico.jsp
<% String defaultSchema=(String)context.get("ElencoERP", "HorasTecnico", "elencoerp_defaultSchema"); System.out.println("---mostrarHorasTecnico.jsp - defaultSchema:" + defaultSchema); %> <iframe width="100%" height="1080" frameborder="0" ;="" src="/ElencoERP/jsps-propios/horasTecnico.jsp"></iframe>Hola José:
Claro que se pierde. Lo de @Inject es para objetos de sesión de OpenXava que son locales del módulo. En tu propio JSP ejecutado directamente, no tienes nada de OpenXava, ni siquiera módulo, ni usuario actual, ni va a cerrarte el manager, ni nada. Para que el JSP pueda usar todo lo disponible en OpenXava tiene que estar definido en vista-web y ser llamado desde el módulo.
Sí que puedes poner valores a la session de servlet con session.settAttribute() y después leerlos desde el JSP. Piensa también que un JSP así es un agujero de seguridad porque se puede llamar directamente desde la URL del navegador sin identificarte.
Ayuda a otros en este foro como yo te ayudo a ti.
Hola JP, estoy viendo como resolverlo y quitarlo.
Mientras encuentro uan solución, tengo el problema de que cada vez que se visualiza este JSP se tiene que volver a loguearse para poder usar otro módulo en la segunda organización (en la principal no pasa).
Puedo resolverlo de alguna manera?
Hola José:
Supongo. Pero sin tener tu código no puedo saberlo. Además, tampoco sé muy bien la secuencia que haces para que falle.
Si dejas el JSP totalmente vacío, y lo pruebas, ¿el problema de tener que volver a logearse sigue estando?
Ayuda a otros en este foro como yo te ayudo a ti.