2012-03-26 2 views
1

Ich habe ein XML, das einem Java-Objekt, d. H. Einem DTO, zugeordnet werden muss. Meine XML einige Wrapper-Elemente hat, die keine Java-Objekte in meiner DTO hat .. meine XML sieht ungefähr so ​​XML kann nicht mithilfe von Jaxb und XMLPath entpackt werden

<UseCaseView> 
<FindCandidates> 
    <CandidatesRequest> 
     <APIRequest> 
      <Code>Code</Code> 
     </APIRequest> 
    </CandidatesRequest> 
</FindCandidates> </UseCaseView> 

Das „FindCandidates“ und „CandidatesRequest“ sind nur Wrapper-Elemente und „APIRequest“ wieder ein DTO .. ​​

ich so bin mit xmlpath in meinem DTO .. ​​Meine Dto wie folgt aussieht ..

@XmlRootElement(name = "UseCaseView") 
public class FindRequestDTO implements Serializable{ 

private static final long serialVersionUID = 5528726225975606325L; 

private ApiRequestDTO apiRequest; 


@XmlPath("FindCandidates/CandidatesRequest/APIRequest") 
public ApiRequestDTO getAPIRequest() { 
    return apiRequest; 
    ......... 

Dies ist das APIRequest Element meiner ApiRequestDTO nicht abbildet, wenn ich die beiden Wrapper entfernen Elemente und Karte direkt mit XMLElement (name = „APIRequest“) es funktioniert ... Aber ich brauche die beiden Wrapper Elemente zu ignorieren und meine DTO zu konstruieren .. Ich habe die Jaxb.properties mit

"javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory" 

in meine Ressourcen-Ordner-Datei hinzugefügt.

kann mir jemand helfen, zu wissen, was falsch hier gehen ..

Dank,

+0

Wenn Sie die 'JAXBContext' schaffen, was die Implementierungsklasse ist, die zurückgegeben wird? Das folgende Beispiel könnte helfen: https: //github.com/bdoughan/blog20110908. Wenn nicht, werde ich morgen eine Antwort schreiben. –

+0

@Blaise - thx für schnelle Antwort .. die zurückgegebene Implementierungsklasse ist com.sun.xml.bind.v2.runtime.JAXBContextImpl – sampath

+0

Haben Sie die eclipselink.jar auf Ihrem Klassenpfad? Das Beispiel, mit dem ich in meinem vorherigen Kommentar verlinkt habe, ist eingerichtet, um mit Maven zu kompilieren und zu laufen. –

Antwort

2

Hinweis: Ich bin das EclipseLink JAXB (MOXy) Blei und ein Mitglied der JAXB 2 (JSR-222) Expertengruppe.

Unten ist ein vollständiges Beispiel, das helfen sollte.

jaxb.properties

Um moxy als JAXB-Provider geben Sie eine Datei jaxb.properties mit folgendem Eintrag in der gleichen Verpackung wie Ihr Domain-Modell namens hinzufügen müssen.

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory 

FindRequestDTO

package forum9881188; 

import java.io.*; 
import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.*; 

@XmlRootElement(name = "UseCaseView") 
public class FindRequestDTO implements Serializable { 

    private static final long serialVersionUID = 5528726225975606325L; 

    private ApiRequestDTO apiRequest; 

    @XmlPath("FindCandidates/CandidatesRequest/APIRequest") 
    public ApiRequestDTO getAPIRequest() { 
     return apiRequest; 
    } 

    public void setAPIRequest(ApiRequestDTO apiRequest) { 
     this.apiRequest = apiRequest; 
    } 

} 

ApiRequestDTO

package forum9881188; 

public class ApiRequestDTO { 
} 

Demo

package forum9881188; 

import javax.xml.bind.*; 

public class Demo { 

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

     FindRequestDTO fr = new FindRequestDTO(); 
     fr.setAPIRequest(new ApiRequestDTO()); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(fr, System.out); 
    } 

} 

Ausgabe

<?xml version="1.0" encoding="UTF-8"?> 
<UseCaseView> 
    <FindCandidates> 
     <CandidatesRequest> 
     <APIRequest/> 
     </CandidatesRequest> 
    </FindCandidates> 
</UseCaseView> 

Weitere Informationen

UPDATE

Wenn Sie aus irgendeinem Grund nicht die moxy Implementierung von JAXBContext bekommen können, können Sie immer die nativen APIs verwenden, um Bootstrap. Wenn die nativen APIs brauchen Sie nicht die jaxb.properties Datei:

package forum9881188; 

import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.JAXBContextFactory; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     //JAXBContext jc = JAXBContext.newInstance(FindRequestDTO.class); 
     JAXBContext jc = JAXBContextFactory.createContext(new Class[] {FindRequestDTO.class}, null); 

     FindRequestDTO fr = new FindRequestDTO(); 
     fr.setAPIRequest(new ApiRequestDTO()); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(fr, System.out); 
    } 

} 
+0

Wenn ich die Update-Lösung I versuchen habe: abgefangen: groovy.lang.MissingMethodException: Keine Signatur der Methode: static org.eclipse.persistence.jaxb.JAXBContextFactory.createContext() gilt für Argumenttypen: ([Ljava.lang.Object ;, null) values: [[ Klasse CommonSvcRs], null] Mögliche Lösungen: createContext ([Ljava.lang.Class ;, java.util.Map), createContext (java.lang.String, java.lang.ClassLoader), createContext ([Ljava.lang.Class ;, java.util.Map, java.lang.ClassLoader), createContext ([Ljava.lang.reflect.Type ;, java.util.Map, java.lang.ClassLoader), ... – Norm212

Verwandte Themen