2017-07-05 1 views
0

Ich habe diesen Code in Scala geschrieben, um mit Jaxb Scala-Objekte in XML zu serialisieren (möchte nicht Scala native XML-Funktionalität verwenden).Verwenden von JAXB in Scala zum Serialisieren nach XML

@XmlRootElement(name = "SESSION") 
@XmlAccessorType(XmlAccessType.FIELD) 
case class Session(
    @XmlAttribute(name="TYPE") 
    sessionType: String 
) { 
    def this() = this("") 
} 

@XmlRootElement(name = "FOO-BAR") 
@XmlAccessorType(XmlAccessType.FIELD) 
case class FooBar(
    @XmlElement 
    session: Session 
) { 
    def this() = this(new Session()) 
} 


object JAXBTest extends App { 
    val context = JAXBContext.newInstance(classOf[FooBar]) 
    val fooBar = FooBar(Session("mysession")) 
    val stringWriter = new StringWriter() 
    val marshaller = context.createMarshaller() 
    marshaller.marshal(hHonors, stringWriter) 
    println(stringWriter.toString) 
} 

Die erzeugte XML sieht aus wie

<FOO-BAR><session><sessionType>mysession</sessionType></session></FOO-BAR> 

Aber die XML Ich möchte

ist
<FOO-BAR><SESSION TYPE="mysession"></SESSION></FOO-BAR> 

Antwort

0

Sie werden scala Typ verwenden, um Anmerkungen neu zu definieren und zu nutzen. Siehe Code unten und beachten Sie die verwendete Fallsensitivität. Ein weiterer Punkt für die Session ist, ist der Name des XmlElement auf dem Feld in FooBar und nicht auf der Klasse

import io.github.javathought.commons.xml.Macros.{xmlAccessorType, xmlRootElement, xmlAttribute, xmlElement} 


import scala.annotation.meta.field 

object Macros { 
    type xmlRootElement = XmlRootElement @companionClass 
    type xmlAccessorType = XmlAccessorType @companionClass 
    type xmlElement = XmlElement @field 
    type xmlAttribute = XmlAttribute @field 

} 

@xmlAccessorType(XmlAccessType.FIELD) 
case class Session(
        @xmlAttribute(name="TYPE") 
        sessionType: String 
       ) { 
    def this() = this("") 
} 

@xmlRootElement(name = "FOO-BAR") 
@xmlAccessorType(XmlAccessType.FIELD) 
case class FooBar(
        @xmlElement(name = "SESSION") 
        session: Session 
       ) { 
    def this() = this(new Session()) 
} 

val hHonors = new FooBar(new Session("Hi")) 

val context = JAXBContext.newInstance(classOf[FooBar]) 
val fooBar = FooBar(Session("mysession")) 
val stringWriter = new StringWriter() 
val marshaller = context.createMarshaller() 
marshaller.marshal(hHonors, stringWriter) 
println(stringWriter.toString) 

ich die erwartete Zeichenfolge erhalten:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><FOO-BAR><SESSION TYPE="Hi"/></FOO-BAR> 
+0

Dies ist das komplette Kern Beispiel mit einem Zusatz: ein Adapter, um 0..1 Kardinalität zu Option https://gist.github.com/javathought/658c0554145ae6b7f89bd34ca71d8e0e zuzuordnen – Javathought

Verwandte Themen