[SOLUCIONADO] Problema con JAXB

Iniciado por coke951, Julio 07, 2015, 11:05:18 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 07, 2015, 11:05:18 PM Ultima modificación: Julio 07, 2015, 11:47:52 PM por Gabriela
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

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

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:
Código: php

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!

La clase Producto, tiene la anotacion XmlRootElement?
De lo contrario agrégasela, luego intenta de nuevo y nos cuentas.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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.
Código: php

...

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


¿a eso te refieres?

Julio 07, 2015, 11:31:32 PM #3 Ultima modificación: Julio 07, 2015, 11:39:09 PM por Gus Garsaky
Si no me equivoco, JAXB trabaja en base a getter/setter. Debes respetar ésta regla. Tu código debería ser:

Código: java

@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.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Si no me equivoco, JAXB trabaja en base a getter/setter. Debes respetar ésta regla. Tu código debería ser:

Código: java

@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!

De nada coke, me alegra que hayas resuelto tu duda.

Saludos,