Underc0de - La Casa de los Informáticos

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: coke951 en Julio 07, 2015, 11:05:18 PM

Título: [SOLUCIONADO] Problema con JAXB
Publicado por: coke951 en Julio 07, 2015, 11:05:18 PM
Que tal, tengo un pequeño problema, no se si realmente estoy aplicando bien JAXB, lo que me gustaria hacer es guardar un objeto de tipo Producto, el cual tiene nombre, codigo, precio, cantidad etc... lo que hago es guardar todos los productos es un List, y despues intentar utilizar JAXB para guardar dicha lista de productos para cuando vuelva a iniciar el programa, cargarlos.

Esta es mi clase ProductoListWraper el cual se encarga de juntar los productos en una lista

Código (java) [Seleccionar]

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "productos")
public class ProductoListWrapper {

private List<Producto> productos;

@XmlElement(name = "producto")
public List<Producto> obtenerProductos(){
return productos;
}

public void setProductos(List<Producto> productos){
this.productos = productos;
}
}



Después tengo los métodos los cuales se encargan de guardar dicha lista en un xml:

Código (java) [Seleccionar]

public void guardarInformacionProductosDesdeArchivo(File file){
try{
JAXBContext context = JAXBContext.newInstance(ProductoListWrapper.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);


ProductoListWrapper wrapper = new ProductoListWrapper();
wrapper.setProductos(productoInfo);


m.marshal(wrapper, file);


setURLPuntoVentaApp(file);
}catch(Exception e){
Dialogs.create()
.title("Error")
.masthead("No pudo ser posible guardar la infomracion en el archivo: "+file.getPath())
.showException(e);
}
}


Este método recibe un objeto de tipo File como atributo, y es que tengo otro método "setURLPuntoVentaApp" el cual sirve para guardar en un registro la ruta del archivo para que cuando vuelva a abrir el programa, cargue este xml automáticamente y "m.marshal(wrapper, file);" que me gustaría explicarlo, pero no tengo ni puta idea  :-X

El error surge cuando intento guardar el .xml

Este es el error que me sale:

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
La anotación JAXB está colocada en un método que no es una propiedad de JAXB
this problem is related to the following location:
at @javax.xml.bind.annotation.XmlElement(name=producto, namespace=##default, type=class javax.xml.bind.annotation.XmlElement$DEFAULT, defaultValue=, required=false, nillable=false)
at puntoVenta.modelo.ProductoListWrapper

at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:445)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:124)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123)
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:462)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
at puntoVenta.PuntoVentaApp.guardarInformacionProductosDesdeArchivo(PuntoVentaApp.java:144)
at puntoVenta.vista.LayoutRaizControlador.handleGuardarEn(LayoutRaizControlador.java:69)
at puntoVenta.vista.LayoutRaizControlador.handleGuardar(LayoutRaizControlador.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1767)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1653)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.control.MenuItem.fire(MenuItem.java:462)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1405)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.lambda$createChildren$341(ContextMenuContent.java:1358)
at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$$Lambda$343/1199140532.handle(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3758)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3486)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2495)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:350)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$350(GlassViewEventHandler.java:385)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$$Lambda$327/1712109139.get(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:404)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:384)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:927)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(WinApplication.java:101)
at com.sun.glass.ui.win.WinApplication$$Lambda$36/2117255219.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)


Tiene que ver algo sobre la anotación, pero estoy viendo en internet un ejemplo, y no logro detectar el problema..

Espero que me puedan ayudar, si necesitan que suba otro código para solucionar este problema, me avisan.

Gracias de antemano, Saludos!
Título: Re:Problema con JAXB
Publicado por: ~ Yoya ~ en Julio 07, 2015, 11:24:26 PM
La clase Producto, tiene la anotacion XmlRootElement?
De lo contrario agrégasela, luego intenta de nuevo y nos cuentas.

Saludos.
Título: Re:Problema con JAXB
Publicado por: coke951 en Julio 07, 2015, 11:27:31 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
La clase Producto, tiene la anotacion XmlRootElement?
De lo contrario agrégasela, luego intenta de nuevo y nos cuentas.

Saludos.

Sip, y me da problemas.

...

@XmlRootElement(name = "productos")
public class ProductoListWrapper {
       
        private List<Pro.....


¿a eso te refieres?
Título: Re:Problema con JAXB
Publicado por: Gus Garsaky en Julio 07, 2015, 11:31:32 PM
Si no me equivoco, JAXB trabaja en base a getter/setter. Debes respetar ésta regla. Tu código debería ser:

Código (java) [Seleccionar]

@XmlRootElement(name = "productos")
public class ProductoListWrapper {
    private List<Producto> productos;

    @XmlElement(name = "producto")
    public List<Producto> getProductos(){ // siempre usa get/set
        return productos;
    }   
    public void setProductos(List<Producto> productos){
        this.productos = productos;
    }
}


Fíjate que estoy usando getProductos. Esto es importantísimo en el mundo Java, muchas cosas en Java trabajan en base a esto, como por ejemplo Java Server Faces y JAXB, entre otras.
Título: Re:Problema con JAXB
Publicado por: coke951 en Julio 07, 2015, 11:37:04 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Si no me equivoco, JAXB trabaja en base a getter/setter. Debes respetar ésta regla. Tu código debería ser:

Código (java) [Seleccionar]

@XmlRootElement(name = "productos")
public class ProductoListWrapper {
    private List<Producto> productos;

    @XmlElement(name = "producto")
    public List<Producto> getProductos(){ // siempre usa get/set
        return productos;
    }   
    public void setProductos(List<Producto> productos){
        this.productos = productos;
    }
}


Fíjate que estoy usando getProductos. Esto es importantísimo en el mundo Java, muchas cosas en Java trabajan en base a esto, como por ejemplo Java Server Faces y JAXB, entre otras.

Perfecto, eso era, no creí que influyera, JAXB es nuevo para mi, tendre que investigar mas. Muchas gracias Gus!
Título: Re:Problema con JAXB
Publicado por: Gus Garsaky en Julio 07, 2015, 11:39:45 PM
De nada coke, me alegra que hayas resuelto tu duda.

Saludos,