Componente Duplicado

2012-12-12
2013-08-07
  • Sergio Oropeza

    Sergio Oropeza - 2012-12-12

    Hola, tengo una clase llamada cheque, al ejecutarla por PRIMERA VEZ me sale el siguiente error:

    org.apache.jasper.JasperException: org.openxava.util.XavaException: Componente duplicado: Cheque

    Luego actualizo el navegador (sin reiniciar el servidor) y no me sale dicho error.

    He revisado bien y no tengo otra clase con ese mismo nombre.

    ¿Alguien sabe por que ocurre el error?

     
  • Javier Paniza

    Javier Paniza - 2012-12-14

    Hola Sergio,

    ¿Accedes a la aplicación cuando ésta ha terminado de desplegarse o antes?

    El error ocurre si esa entidad está dos veces en tu aplicación (por ejemplo en dos jars o en dos paquetes model diferente). Pero si no no debería de ocurrir.


    Ayuda a otros en este foro como yo te ayudo a ti.
    Antes de poner una pregunta busca en este mismo foro la respuesta
    y lee la documentación de OpenXava en openxava.org.

     
  • Sergio Oropeza

    Sergio Oropeza - 2012-12-17

    Estoy accediendo a la aplicación despues de desplegarse. Ya revisé en todos los paquetes y no hay otra entidad con ese mismo nombre.

    Como dato adicional:
    - Es un aplicación sin mucha complejidad, y no estoy usando un paquete o un complemento adicional a openXava (4.5.1).
    - Estoy desplegando la aplicación desde eclipse Indigo Service Release 2, Tomcat 6.0 (El que viene incluido con el paquete OpenXava).

     
  • Javier Paniza

    Javier Paniza - 2012-12-19

    Hola Sergio,

    prueba borrar parar el Tomcat y borrar las carpetas work y temp (Desde el eclipse usa la opción "Clean Tomcat Work directory).

    ¿Has revisados los jars que tienes en el WEB-INF/lib de tu aplicación?


    Ayuda a otros en este foro como yo te ayudo a ti.
    Antes de poner una pregunta busca en este mismo foro la respuesta
    y lee la documentación de OpenXava en openxava.org.

     
  • Jose Abelardo Gutierrez

    Soy compañero de trabajo de Sergio Oropeza, tratando de indagar mas a fondo el asunto de "duplicate_component", para poner todo mas claro Javier el WEB-INF/lib esta estándar tal cual lo crea el crear proyecto del OpenXava 4.5.1.

    Para tratar de entender un poco mas lo que pasa modifique el método "org.openxava.component.MetaComponent.get(String name)" para que no arrojara la excepción que arroja por duplicate_component y puse en vez de eso un par de logs. de la siguiente manera:

    public static MetaComponent get(String name) throws ElementNotFoundException, XavaException {
            MetaComponent r = (MetaComponent) components.get(name);     
            if (r == null) {        
                if (name.indexOf('.') >= 0) { // A component never is qualified
                    throw new ElementNotFoundException("component_not_found", name);
                }
                r = ComponentParser.parse(name);        
                if (r == null) {                
                    throw new ElementNotFoundException("component_not_found", name);
                }
                r.validate();                       
                Object previous = components.put(name, r);
                System.out.println(MetaComponent.class.getName() + ".get(): " + name); 
                if (previous != null) {
                    //throw new XavaException("duplicate_component", name);
    
                    MetaComponent p = (MetaComponent) previous;
                    p.getMetaEntity().getPOJOClassName();               
                    System.out.println(MetaComponent.class.getName() + ".get(): duplicate_component: " 
                            + " previous POJOClassName = " + p.getMetaEntity().getPOJOClassName()
                            + " r POJOClassName = " + r.getMetaEntity().getPOJOClassName());                
                }
            }       
            return r;
        }
    

    con dicha modificación el módulo Cheque carga a la primera vez sin problema alguno y los resultados del log son los siguientes:


    org.openxava.component.MetaComponent.get(): Proveedor
    org.openxava.component.MetaComponent.get(): CuentaTipo
    org.openxava.component.MetaComponent.get(): Banco
    org.openxava.component.MetaComponent.get(): Cuenta
    org.openxava.component.MetaComponent.get(): CuentaRegistro
    org.openxava.component.MetaComponent.get(): Unidad
    org.openxava.component.MetaComponent.get(): Categoria
    org.openxava.component.MetaComponent.get(): Insumo
    org.openxava.component.MetaComponent.get(): Almacen
    org.openxava.component.MetaComponent.get(): ImpuestoTipo
    org.openxava.component.MetaComponent.get(): Articulo
    org.openxava.component.MetaComponent.get(): ArticuloRegistro
    org.openxava.component.MetaComponent.get(): MovimientoDetalle
    org.openxava.component.MetaComponent.get(): ProcesoTipo
    org.openxava.component.MetaComponent.get(): Proceso
    org.openxava.component.MetaComponent.get(): ProcesoEntrada
    org.openxava.component.MetaComponent.get(): ProcesoSalida
    org.openxava.component.MetaComponent.get(): Movimiento
    org.openxava.component.MetaComponent.get(): Empleado
    org.openxava.component.MetaComponent.get(): Gasto
    org.openxava.component.MetaComponent.get(): TransaccionTipo
    org.openxava.component.MetaComponent.get(): Cheque
    org.openxava.component.MetaComponent.get(): Transaccion
    org.openxava.component.MetaComponent.get(): Cheque
    org.openxava.component.MetaComponent.get(): duplicate_component: previous POJOClassName = com.siger.model.Cheque r POJOClassName = com.siger.model.Cheque
    applicationName = 'siger' newModule = 'Cheque' moduleName = 'Cheque'


    Por lo que puedo entender el modulo Cheque de la entidad com.siger.model.Cheque se esta cargando dos veces. Pero apenas tengo una hora tratando de entender la arquitectura interna de OpenXava para saber la razón de esto y por ello aun mi cerebro no hace "click".

    cualquier ayuda o guía extra para yo mismo seguir indagando sería muy apreciada.

     
    Last edit: Jose Abelardo Gutierrez 2012-12-20
  • Jose Abelardo Gutierrez

    investigando mas en profundidad me di cuenta que Cheque es cargado por primera vez en MetaComponent.components desde Transaccion. El caso es que existe una relación de uno a uno entre Cheque y Transacción y el atributo cheque de Transaccion tiene una anotación @OnChange y si elimino dicha anotación el modulo de Cheque carga de una sin problema alguno.

    la ruta de ejecución disparada por OnChangeAction del atributo Cheque en Transaccion es:
    AnnotatedClassParser.processAnnotations que en la linea 1794 llama a
    MetaReference.getMetaModelReferenced que en la linea 73 llama a
    MetaComponent.get que en la línea 66 registra por primera vez a Cheque

    ~~~~~~~
    org.openxava.component.MetaComponent.get(MetaComponent.java:69)
    org.openxava.model.meta.MetaReference.getMetaModelReferenced(MetaReference.java:73)
    org.openxava.annotations.parse.AnnotatedClassParser.processAnnotations(AnnotatedClassParser.java:1794)
    org.openxava.annotations.parse.AnnotatedClassParser.addReference(AnnotatedClassParser.java:330)
    org.openxava.annotations.parse.AnnotatedClassParser.addMember(AnnotatedClassParser.java:227)
    org.openxava.annotations.parse.AnnotatedClassParser.parseMembers(AnnotatedClassParser.java:173)
    org.openxava.annotations.parse.AnnotatedClassParser.parse(AnnotatedClassParser.java:91)
    org.openxava.component.ComponentParser.parseAnnotatedClass(ComponentParser.java:47)
    org.openxava.component.ComponentParser.parse(ComponentParser.java:36)
    org.openxava.component.MetaComponent.get(MetaComponent.java:61)
    org.openxava.model.meta.MetaReference.getMetaModelReferenced(MetaReference.java:73)
    org.openxava.annotations.parse.AnnotatedClassParser.addReference(AnnotatedClassParser.java:351)
    org.openxava.annotations.parse.AnnotatedClassParser.addMember(AnnotatedClassParser.java:227)
    org.openxava.annotations.parse.AnnotatedClassParser.parseMembers(AnnotatedClassParser.java:173)
    org.openxava.annotations.parse.AnnotatedClassParser.parse(AnnotatedClassParser.java:91)
    org.openxava.component.ComponentParser.parseAnnotatedClass(ComponentParser.java:47)
    org.openxava.component.ComponentParser.parse(ComponentParser.java:36)
    org.openxava.component.MetaComponent.get(MetaComponent.java:61)
    org.openxava.component.MetaComponent.exists(MetaComponent.java:88)
    org.openxava.application.meta.MetaApplication.existsModel(MetaApplication.java:151)
    org.openxava.application.meta.MetaApplication.getMetaModule(MetaApplication.java:140)
    org.openxava.controller.ModuleManager.getMetaModule(ModuleManager.java:1026)
    org.openxava.controller.ModuleManager.setupModuleControllers(ModuleManager.java:230)
    org.openxava.controller.ModuleManager.setModuleName(ModuleManager.java:999)
    org.apache.jsp.xava.module_jsp._jspService(module_jsp.java:166

    luego se registra Cheque por segunda vez del propio modulo causando la excepción:
    
    org.openxava.component.MetaComponent.get(MetaComponent.java:74)
    org.openxava.component.MetaComponent.exists(MetaComponent.java:88)
    org.openxava.application.meta.MetaApplication.existsModel(MetaApplication.java:151)
    org.openxava.application.meta.MetaApplication.getMetaModule(MetaApplication.java:140)
    org.openxava.controller.ModuleManager.getMetaModule(ModuleManager.java:1026)
    org.openxava.controller.ModuleManager.setupModuleControllers(ModuleManager.java:230)
    org.openxava.controller.ModuleManager.setModuleName(ModuleManager.java:999)
    org.apache.jsp.xava.module_jsp._jspService(module_jsp.java:166)
    

    ~~~~~~~~

     
    Last edit: Jose Abelardo Gutierrez 2012-12-20
  • Jose Abelardo Gutierrez

    por ahora la solución que veo es cambiar la linea 69 de MetaComponent.get así:

    - throw new XavaException("duplicate_component", name);
    
    + MetaComponent prev = (MetaComponent) previous;
    + if (!prev.getMetaEntity().getPOJOClassName().equals(r.getMetaEntity().getPOJOClassName())) {
    +     throw new XavaException("duplicate_component", name);
    + } 
    

    pero como no conozco bien el framework por dentro no se si eso tenga consecuencias no deseadas

     
  • Jose Abelardo Gutierrez

    bueno verificado, hice un proyecto con solo tres clases: Cheque, Transaccion y TransaccionOnChangeAction, y se produce el mismo error, solo quiero confirmación si mi solución propuesta es o no correcta.

    /////////////////////////////////////////////////////////////
    package com.siger.model;
    
    import javax.persistence.*;
    import org.openxava.annotations.*;
    
    @Entity
    @View(members = "codigo")
    @Tab(properties = "codigo")
    public class Cheque {
    
        @Id @Column(length=3)
        @Required
        private int codigo;
    
        @OneToOne(mappedBy = "cheque", optional=true)
        private Transaccion transaccion;
    
        public int getCodigo() {
            return codigo;
        }
        public void setCodigo(int codigo) {
            this.codigo = codigo;
        }
        public Transaccion getTransaccion() {
            return transaccion;
        }
        public void setTransaccion(Transaccion transaccion) {
            this.transaccion = transaccion;
        }    
    }
    /////////////////////////////////////////////////////////////
    package com.siger.model;
    
    import javax.persistence.*;
    
    import org.openxava.annotations.*;
    import com.siger.action.*;
    
    @Entity
    @View(members = "codigo; cheque")
    @Tab(properties = "codigo")
    public class Transaccion {
    
        @Id @Column(length=3) 
        @Required
        private int codigo;
    
        @OneToOne(optional = true, cascade=CascadeType.ALL)
        @DescriptionsList(descriptionProperties = "codigo")
        @OnChange(TransaccionOnChangeAction.class)
        private Cheque cheque;
    
        public int getCodigo() {
            return codigo;
        }
        public void setCodigo(int codigo) {
            this.codigo = codigo;
        }
        public Cheque getCheque() {
            return cheque;
        }
        public void setCheque(Cheque cheque) {
            this.cheque = cheque;
        }    
    }
    /////////////////////////////////////////////////////////////
    package com.siger.action;
    
    import org.openxava.actions.*;
    
    public class TransaccionOnChangeAction 
           extends OnChangePropertyBaseAction {
        public void execute() throws Exception {
            System.out.println(getClass().getName() + "execute()");
        }
    }
    /////////////////////////////////////////////////////////////
    
     
    Last edit: Jose Abelardo Gutierrez 2012-12-20
  • Javier Paniza

    Javier Paniza - 2012-12-21

    Hola José,

    gracias por reportar el bug, lo arreglaremos.
    Si tu solución funciona para tu aplicación, perfecto. La examinaré con detenimiento, lo importante es que después del cambio pase toda la suite de pruebas de OpenXava y que se siga detectando si hay un componente duplicado de verdad.


    Ayuda a otros en este foro como yo te ayudo a ti.
    Antes de poner una pregunta busca en este mismo foro la respuesta
    y lee la documentación de OpenXava en openxava.org.

     
  • gustavo navarro

    gustavo navarro - 2013-07-10

    hola, yo tengo el mismo erro, pero el mio se produce cuando utilizo @ManyToOne y @OnChange juntos, es decir que cuando le pongo el @OnChange a un combo, me produce el error:

    GRAVE: Componente duplicado: Ruta
    org.openxava.util.XavaException: Componente duplicado: Ruta
    at org.openxava.component.MetaComponent.get(MetaComponent.java:67)
    at org.openxava.model.meta.MetaReference.getMetaModelReferenced(MetaReference.java:83)
    at org.openxava.model.meta.MetaReference.isAggregate(MetaReference.java:94)
    at org.openxava.view.View.createAndAddSubview(View.java:770)
    at org.openxava.view.View.createSubviews(View.java:979)
    at org.openxava.view.View.getSubviews(View.java:968)
    at org.openxava.view.View.setEditable(View.java:2128)
    at org.openxava.view.View.setEditable(View.java:2169)
    at org.openxava.view.View.createSubviews(View.java:981)
    at org.openxava.view.View.getSubviews(View.java:968)
    at org.openxava.view.View.getGroupsViews(View.java:927)
    at org.openxava.view.View.getMembersNamesInGroup(View.java:1063)
    at org.openxava.view.View.trySetValue(View.java:1021)
    at org.openxava.view.View.addValues(View.java:465)
    at org.openxava.view.View.setValues(View.java:496)
    at org.openxava.view.View.setValues(View.java:487)
    at org.openxava.actions.ViewDetailAction.execute(ViewDetailAction.java:86)
    at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:399)
    at org.openxava.controller.ModuleManager.executeAction(ModuleManager.java:318)
    at org.openxava.controller.ModuleManager.execute(ModuleManager.java:278)
    at org.apache.jsp.xava.execute_jsp._jspService(execute_jsp.java:192)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    at org.openxava.web.servlets.Servlets.getURIAsStream(Servlets.java:66)
    at org.openxava.web.dwr.Module.getURIAsStream(Module.java:204)
    at org.openxava.web.dwr.Module.request(Module.java:62)
    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:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:619)

     
  • gustavo navarro

    gustavo navarro - 2013-07-10

    es un bug realmente? ya se solucionó?? .. cuando le quito la etiqueta @OnChange al ComboBox el error no aparece, se la pongo y sale el error

     
  • Javier Paniza

    Javier Paniza - 2013-07-12

    Hola Gustavo,

    el bug todavía está abierto. Lo más seguro es que lo arreglemos para OX4.8.1, en septiembre. De momento tendrás que solucionar tu problema de otra forma o arreglar tu mismo el bug y contribuirlo.


    Ayuda a otros en este foro como yo te ayudo a ti.
    ¿Necesitas más ayuda? Usa el soporte profesional de OpenXava

     
  • gustavo navarro

    gustavo navarro - 2013-08-07

    gracias por responder.

     

Log in to post a comment.

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:





No, thanks