“序列化中的问题”;scala.math.BigDecimal没有无参数默认构造函数";

“序列化中的问题”;scala.math.BigDecimal没有无参数默认构造函数";,scala,jaxb,bigdecimal,Scala,Jaxb,Bigdecimal,我不熟悉scala编程和java,所以我的问题是: 我有一个要用BigDecimal属性序列化的对象 import java.util.Date import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter import reflect.BeanProperty class TestObject { @XmlJavaTypeAdapter(classOf[BigDecimalAdapter]) var test: BigDec

我不熟悉scala编程和java,所以我的问题是:

我有一个要用BigDecimal属性序列化的对象

import java.util.Date
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
import reflect.BeanProperty

class TestObject {
  @XmlJavaTypeAdapter(classOf[BigDecimalAdapter])
  var test: BigDecimal = 0.00
}
我收到这个错误:

scala.math.BigDecimal does not have a no-arg default constructor
XmlAdapter:

import javax.xml.bind.annotation.adapters.XmlAdapter

class BigDecimalAdapter extends XmlAdapter[String, BigDecimal] {
  def unmarshal(str: String) = BigDecimal(str)
  def marshal(bD: BigDecimal) = bD.toString()
}
SOAPServer:

import javax.jws.soap.SOAPBinding
import javax.jws.{WebParam, WebMethod, WebService}
import javax.xml.ws.Endpoint

@WebService(targetNamespace="test", name="testws", portName="test", serviceName="wsTest")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
class Server {
  @WebMethod(action = "test")
  def test(@WebParam(name = "testParam") testParam:TestObject): TestObject = {
    return testParam
  }

}

object SoapServer { // defined Companion Object for our class
  def main(args: Array[String]) { // main method to make this a runnable application
    val endpoint = Endpoint.publish("http://192.168.189.132:8080/wsTest", new Server())
    System.out.println("Binded to port 8080. Waiting for requests...")
  }
}

我认为您可能希望使用
java.math.BigDecimal
,而不是
scala.math.BigDecimal
。使用完全限定路径名:

 import java.math.{BigDecimal => JDec}
 var test: JDec = new JDec(0)

jaxb框架似乎期待一个无参数构造函数;我对它不太熟悉,无法理解为什么这个解决方案可以解决这个问题。为了完整起见,java版本和scala版本之间有什么区别?scala版本是经典的“pimp my library”模式,您可以使用标准数学符号(
+*-/
)作为运算符。还有一个
Numeric[BigDecimal]
,这样你就可以像
myObjs.map(u.test).sum
这样做。你也可以与其他数字进行交互;例如
myObj.test==0