1
votes

J'ai @xmlrootelement, mais continuez à obtenir cette exception: impossible de marshaler le type en tant qu'élément car il manque un @XmlRootElement

J'essaye de marshall / unmarshall une classe qui n'a pas @xmlrootelement . Quelqu'un peut-il aider? Le marshaller que j'utilise est de type Jaxb2Marshaller of the Spring's org.springframework.oxm.jaxb La plupart des solutions présentes sont de type javax.xml.bind Marshaller et JAXBContext . Besoin d'aide pour marshalling une classe Java qui n'a pas de @xmlrootelement fourni, générée à partir de XML en utilisant le JAXB2MARSHALLER de Spring.

Je ne le suis pas capable d'ajouter le @xmlrootelement car il s'agit d'un .jar

J'ai essayé toutes ces solutions qui fournissent en fait un moyen de marshalling / unmarshalling en utilisant javax au lieu de spring

impossible de rassembler le type en tant qu'élément car il manque une annotation @XmlRootElement pour les classes générées automatiquement

Impossible de marshaler le type comme élément XML car l'annotation @XmlRootElement est manquante p>

Y compris ceci qui a une explication très soignée mais utilise Marshaller au lieu de JaxB2Mar shaller

https://howtodoinjava.com/jaxb/marshal-without -xmlrootelement /

La classe doit subir un Marshalling sans @xmlrootelement

PartnerRequest.java classe qui a @xmlrootelement code >

[com.sun.istack.internal.SAXException2: unable to marshal type "com.svc.partner.v1.PartnerRequest" as an element because it is missing an @XmlRootElement annotation]
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:933)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.marshal(Jaxb2Marshaller.java:709)
    at org.springframework.ws.support.MarshallingUtils.marshal(MarshallingUtils.java:81)
    at org.springframework.ws.client.core.WebServiceTemplate$2.doWithMessage(WebServiceTemplate.java:395)
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:573)
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:539)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:386)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:380)
    at com.vmd.services.BaseService.marshallSendAndReceive(BaseService.java:53)
    at com.vmd.services.PartnerServiceImpl.getPartner(PartnerServiceImpl.java:27)
    at com.vmd.services.PartnerServiceImplTest.ShouldGetPartner(PartnerServiceImplTest.java:36)
    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:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: javax.xml.bind.MarshalException: null
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:311)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:236)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.marshal(Jaxb2Marshaller.java:705)
    ... 39 common frames omitted
Caused by: com.sun.istack.internal.SAXException2: unable to marshal type "com.svc.partner.v1.PartnerRequest" as an element because it is missing an @XmlRootElement annotation
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:234)
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:323)
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:479)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308)
    ... 41 common frames omitted

L'exception que j'obtiens est comme ci-dessous:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "",
    propOrder = {"partnerCdId", "clientProductCode"}
)
@XmlRootElement(
    name = "PartnerRequest"
)
public class PartnerRequest



    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(
        name = "Partner",
       )
    public class Partner{
    }

Aussi, n'oubliez pas que nous devons le marshaller en utilisant Jaxb2Mashaller pas Marshaller. Ceci est un code jar / dépendance externe non modifiable.

Merci d'avance.


8 commentaires

Cela a-t-il résolu votre requête?


En fait, cela n'a pas résolu ma requête, mais il semble que j'ai une classe PartnerRequest, qui se présente comme suit: @XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "", propOrder = {"partnerCdId", "clientProductCode" }) @XmlRootElement (name = "PartnerRequest") classe publique PartnerRequest Cela a @xmlrootelement mais il se plaint toujours d'une annotation manquante


J'ai mis à jour mon problème. Faites-moi savoir, j'ai @xmlrootelement dans le PartnerRequest, encore une exception montre un problème pour que la demande de partenaire ne l'ait pas


Le fait d'avoir un @XmlRootElement a complètement annulé la question d'origine. Ma solution d'origine ne fonctionne pour aucun @XmlRootElement . Permettez-moi d'inclure la gestion d'un avec @XmlRootElement .


J'ai mis à jour mon repo git avec l'exemple pour un avec l'élément racine également. Si vous voyez toujours le problème, cherchez comment le Jaxb2Marshaller est initialisé et quelles classes / packages sont liés dans le contexte? Aussi si vous n'avez pas de conflit dans la classe PartnerRequest de l'application. Si l'élément racine est présent, il devrait fonctionner sans aucun problème.


Cela a-t-il résolu votre requête? Avez-vous réussi à obtenir le résultat souhaité? Veuillez consulter Que dois-je faire lorsque quelqu'un répond à ma question? . En tant que demandeur, vous disposez d'un privilège spécial: vous pouvez accepter la réponse qui, selon vous, est la meilleure solution à votre problème.


J'ai pu le résoudre, mais votre inquiétude a certainement aidé. Merci


Heureux d'avoir pu aider. Bienvenue dans Stack Overflow. Veuillez noter que la meilleure façon de dire `` merci '' ici est de voter pour les bonnes questions et les réponses utiles (une fois que vous avez suffisamment de réputation pour le faire), et d'accepter la réponse la plus utile à toute question que vous posez (ce qui donne également vous un petit coup de pouce à votre réputation)


4 Réponses :


0
votes

J'ai corrigé l'exception similaire en utilisant JAxBElement:

JAXBContext jaxbContext = JAXBContext.newInstance(Foo.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

Veuillez essayer une fois, si cela ne fonctionne pas, veuillez partager un exemple de XSD pour une enquête plus approfondie.


1 commentaires

Comme mentionné précédemment, j'ai essayé cela. JAXBCONTEXT provient de javax.xml.bind . Besoin de quelque chose de SpringFramework



0
votes

Le Marshalling & Unmarshalling ne peuvent pas être effectués sans un analyseur pour connaître l'élément racine. Ainsi, lorsque vous n'avez pas @XmlRootElement dans la classe de données, vous contournez en utilisant JAXBElement , où vous fournissez votre classe de modèle enveloppée dans celui-ci, afin que le marshaller sache quelle source structure de classe à référencer lors de l'analyse.

J'ai inclus ci-dessous l'exemple de travail d'utilisation de JAXBElement avec spring Jaxb2Marshaller.

@SpringBootApplication
public class XmlTransformationNoRoot {

    public static void main(String[] args) {
        SpringApplication.run(XmlTransformationNoRoot.class, args);
    }

}

@Component
class TestTransformation implements CommandLineRunner {

    public void run(String[] args) throws JAXBException {

        //marshalling
        String testXML = marshallXml(new Partner("HelloWorld"));
        System.out.println("Marshalled : " + testXML);

        //unmarshalling
        System.out.println("Unmarshalled : " + unmarshallXml(testXML, Partner.class));
    }

    public <T> String marshallXml(T object) throws JAXBException {
        StringWriter sw = new StringWriter();
        Result result = new StreamResult(sw);
        jaxb2Marshaller().marshal(new JAXBElement(
                new QName(object.getClass().getPackage().getName(), object.getClass().getSimpleName()),
                object.getClass(), object), result);
        return sw.toString();
    }

    @SuppressWarnings("unchecked")
    public <T> T unmarshallXml(String source, Class<T> clazz) throws JAXBException {
        Jaxb2Marshaller marshaller = jaxb2Marshaller();
        //this line voids singleton use of Jaxb2Marshaller
        marshaller.setMappedClass(clazz);
        return (T) marshaller.unmarshal(new StreamSource(new StringReader(source)));
    }

    public Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setMarshallerProperties(new HashMap() {{
            put(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);
        }});
        marshaller.setClassesToBeBound(new Class[]{Partner.class});
        return marshaller;
    }
}

J'espère que cela vous aidera. Code source exécutable disponible sur mon github repo.


0 commentaires

0
votes

J'ai enfin pu résoudre le problème, le problème était lié au nom du package et j'ai semblé importer le mauvais package, pour lequel il se plaignait du fait que partnerRequest manquait @ xmlrootelement .

Donc, enfin, nous devons être prudents, lorsque nous avons deux classes du même nom et lors de l'importation avec des packages corrects. Merci tout le monde!


0 commentaires

0
votes

Dans Spring Boot 2, j'utilise habituellement le

<xs:element name="..."

Cependant, je recevais toujours l'erreur. Ce n'est que lorsque j'ai découvert le type complexe que j'essayais de marshaler. Une fois que j'ai enveloppé cet objet dans un

@Bean
MessageConverter getMessageConveter() {
    Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
    jaxb2Marshaller.setContextPath(ObjectFactory.class.getPackage().getName());
    Map<String, Object> prop = new HashMap<>();
    prop.put(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    jaxb2Marshaller.setMarshallerProperties(prop);
    jaxb2Marshaller.setCheckForXmlRootElement(false);
    return new MarshallingMessageConverter(jaxb2Marshaller);
}

, il a généré un @XMLRootElement forte> annotation comme prévu.


0 commentaires