2013-11-27 30 views
0

我想讀一些XML到案例類,反之亦然。一切似乎都很好,但列表屬性。我不知道有關異常:如何在Scala中使用JAXB取消/編組列表?

Exception in thread "main" javax.xml.bind.UnmarshalException: Unable to create an instance of scala.collection.immutable.List 

順便說一句,可能是JAXB不適合我的目的,在所有和我應該使用XML處理本地斯卡拉方式?但我的目標XSD非常大,我認爲這會很痛苦。

這裏是我的代碼:

package common 

import java.io.StringReader 
import scala.annotation.target.field 
import javax.xml.bind.annotation._ 
import javax.xml.bind.annotation.adapters._ 
import javax.xml.bind._ 
import common.Types.{xmlTypeAdapter, xmlElement} 

@XmlRootElement(name = "person") 
@XmlAccessorType(XmlAccessType.FIELD) 
case class Person(
    @xmlElement(required = true) fullname: String, 
    username: String, 
    age: Int, 
    favNumbers: List[Int]){ 

    private def this() = this("", "", 0, List()) 
} 

object JaxbTest { 

    val context = JAXBContext.newInstance(classOf[Person]) 

    def main(args: Array[String]) { 
    val personXml1 = "<person><fullname>Martin Krasser</fullname><username>mrt1nz</username><age>30</age><favNumbers><favNumber>73</favNumber><favNumber>47</favNumber></favNumbers></person>" 
    assert(context.createUnmarshaller().unmarshal(new StringReader(personXml1)) == 
     Person("Martin Krasser", "mrt1nz", 30, List(73,47))) 
    context.createMarshaller.marshal(Person("Martin Krasser", "mrt1nz", 30, List(73,47)), System.out) 
    } 
} 

package object Types { 
    type xmlElement = [email protected] 
    type xmlTypeAdapter = [email protected] 
} 
+1

它給出了堆棧跟蹤嗎?如果遇到問題,請考慮爲JAXB使用Java集合,並使用scala.collection.JavaConverters將它們封裝起來。 –

+0

絕對需要使用Java集合 – sourcedelica

+0

謝謝大家,我會嘗試java的ArrayList而不是不可變的scala的List – vicont

回答

0

正如在評論中注意到,Java集合工作得很好。

我已經發布了代碼here