errores al usar xjc:superClass con anotación XmlTransient en superclase con EclipseLink Moxy (código generado por jaxb 2.1)


Estoy usando xjc:superClass y una anotación @javax.xml.bind.annotation.XmlTransient en la superclase.

Estoy tratando de cambiar a Moxy y me sale este error:

'Exception Description: Property [aspectStyleBlock] in class [com.aplia.q4.document.ValueStyle] references a class [com.aplia.q4.domain.AbstractBlock] that is marked transient, which is not allowed.
 - with linked exception:
[Exception [EclipseLink-50057] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.JAXBException
' . 

Todo esto funciona bien bajo jaxb 2.1

Si elimino la anotación XmlTransient en la superclase, obtengo este error:

'ava.lang.RuntimeException: javax.xml.bind.JAXBException
 - with linked exception:
[java.lang.NullPointerException]
....

'Caused by: javax.xml.bind.JAXBException
 - with linked exception:
[java.lang.NullPointerException]
    at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:825)
    at org.eclipse.persistence.jaxb.JAXBContext.<init>(JAXBContext.java:136)
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:142)
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:129)
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:93)
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:83)
    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 javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:331)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    at com.aplia.q4.service.hosting.impl.JAXBAdapter.<init>(JAXBAdapter.java:35)
    ... 27 more
Caused by: java.lang.NullPointerException
    at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateChoiceCollectionMapping(MappingsGenerator.java:686)
    at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateMapping(MappingsGenerator.java:434)
    at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateMappings(MappingsGenerator.java:1996)
    at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateMappings(MappingsGenerator.java:1957)
    at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateProject(MappingsGenerator.java:193)
    at org.eclipse.persistence.jaxb.compiler.Generator.generateProject(Generator.java:174)
    at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:830)
    at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:823)
    ... 41 more'

Tengo alrededor de 100 clases generadas a partir del esquema (no controlo el esquema). traté de usar http://jaxb2-commons.dev.java.net/basic/inheritance para implementar una interfaz en lugar de xjc: superclase, pero requerirá que enumere todas mis 100 clases, ya que los enlaces xpath no pueden coincidir en varios nodos. Renuente a hacerlo a menos que sea la única forma de solucionar el problema.

Esto está bloqueando mis esfuerzos para convertir a Moxy impl.

Detalles sobre mi configuración y por qué elegí agregar la anotación XmlTransient:

del https://sites.google.com/site/codingkb/java-2/jaxb/jaxb-4

"provoca que @XmlValue no esté permitido en una clase que deriva de otra clase. Le gustaría que sus clases JAXB generadas automáticamente extiendan una clase principal común... Entonces agregue algo como esto a su XSD:

Desafortunadamente, cuando va a compilar, recibe un mensaje de error: Excepción en el subproceso "principal" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 recuento de IllegalAnnotationExceptions @XmlValue no está permitido en una clase que deriva de otra clase .

La solución es agregar una anotación a la clase base: @javax.xml.bind.annotation.XmlTransient public class JAXBSuperClass { ... }"

Mi archivo pom (solo partes relevantes):

<dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.1.13</version>
        <scope>runtime</scope>
    </dependency>

        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.7.4</version>
            <executions>
                <execution>
                    <id>generate-q4-document-jaxb</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <extension>true</extension>
                        <args>
                            <arg>-Xboolean-getter</arg>
                            <arg>-Xinheritance</arg>
                        </args>
                        <plugins>
                            <plugin>
                                    <groupId>org.jvnet.jaxb2_commons</groupId>
                                   <artifactId>jaxb2-basics</artifactId>
                                   <version>0.5.3</version>
                               </plugin>
                            <plugin>
                                <groupId>com.nebulent.xjc</groupId>
                                <artifactId>boolean-getter</artifactId>
                                <version>1.0</version>
                            </plugin>
                        </plugins>
                        <schemaDirectory>${project.build.directory}/generated-sources/schema</schemaDirectory>
                        <bindingDirectory>${basedir}/src/main/resources/jaxb-bindings</bindingDirectory>
                        <forceRegenerate>true</forceRegenerate>
                    </configuration>
                </execution>
            </executions>
        </plugin>

avíseme si necesita un esquema o cualquier otra información.

gracias de antemano!

preguntado el 03 de mayo de 12 a las 19:05

1 Respuestas

Nota: Soy el EclipseLink JAXB (MOXy) líder y miembro de la JAXB (JSR-222) grupo de expertos.

Hay un par de problemas relacionados con tu pregunta:


Problema n.° 1: excepción de MOXy

¿Podría proporcionar una pequeña muestra que demuestre el problema que está viendo?

ACTUALIZACIÓN 1: Creo que el problema que está viendo está relacionado con el siguiente error de EclipseLink:

ACTUALIZACIÓN 2: Hemos solucionado el error en las transmisiones EclipseLink 2.3.3 (descarga disponible el 10 de mayo) y 2.4.0 (descarga disponible el 11 de mayo). Los descarga desde la siguiente ubicación:


Problema n.º 2: @XmlValue en una subclase

El JAXB RI no puede manejar este caso de uso:

Exception in thread "main" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
@XmlValue is not allowed on a class that derives another class.
    this problem is related to the following location:
        at public java.lang.String forum10437666.Child.getValue()
        at forum10437666.Child

    at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
    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 javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:363)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    at forum10437666.ValueDemo.main(ValueDemo.java:11)

EclipseLink JAXB (MOXy) puede, siempre que la clase principal no asigne ninguno de sus campos/propiedades a elementos XML:

Padre

La clase principal solo contiene asignaciones a atributos XML.

package forum10437666;

import javax.xml.bind.annotation.XmlAttribute;

public class Parent {

    private int id;

    @XmlAttribute
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

Niño

Child Se extiende Parent y tiene una propiedad mapeada con @XmlValue.

package forum10437666;

import javax.xml.bind.annotation.XmlValue;

public class Child extends Parent {

    private String value;

    @XmlValue
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

ValorDemo

package forum10437666;

import javax.xml.bind.*;
import javax.xml.namespace.QName;

public class ValueDemo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Child.class);

        Child child = new Child();
        child.setId(123);
        child.setValue("ABC");

        JAXBElement<Child> je = new JAXBElement<Child>(new QName("child"), Child.class, child);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(je, System.out);
    }

}

Salida

<?xml version="1.0" encoding="UTF-8"?>
<child xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="123">ABC</child>

contestado el 10 de mayo de 12 a las 20:05

hola Blaise, gracias por contestar. Le envié un correo electrónico a través de su formulario de blog, puedo proporcionar ejemplos de código completo de mi caso por correo electrónico, pero no puedo publicarlos en un sitio público. si responde a mi correo electrónico con su dirección, le enviaré un zip de todo el proyecto (maven2). Tenga en cuenta que estoy usando un XSD fijo (generado por Trang desde un .rnc, en realidad), por lo que no estoy escribiendo las clases de Java, sino generándolas usando jaxb. ¡Gracias de nuevo por la rápida respuesta! - Jinn

@Jinn: actualicé mi respuesta y envié una respuesta a su correo electrónico. - bdoughan

felizmente usando moxy ahora - el problema se solucionó en las versiones más nuevas e incluso recibió un parche de Blaise - Jinn

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.