我已经编写了一个通过scala.xml lib生成Elem类型的常用方法。但是Jersey使用JAXB,意味着用Java对象绑定xml信息。我怎么能简单地用scala的Elem类型回复,避免构造一个对象?
简单代码:
@GET
@Path("sitemap.xml")
@Produces(Array(MediaType.APPLICATION_XML))
def sitemap( @Context client: DaoService[Future]) = {
val x: Elem = Common.defaultXml()
x
}
答案 0 :(得分:0)
您需要自定义MessageBodyWriter
来处理Elem
类型。此组件是所有Java对象通过序列化到响应流的组件。您可以在JAX-RS Entity Providers了解更多信息。例如,对于Elem
,您可以使用类似
import java.io.OutputStream
import java.lang.Class
import java.lang.reflect.Type
import java.lang.annotation.Annotation
import javax.ws.rs.{ Produces }
import javax.ws.rs.core.{ MultivaluedMap, MediaType }
import javax.ws.rs.ext.{ MessageBodyWriter, Provider }
import scala.xml.Elem
@Provider
@Produces(Array("application/xml"))
class ElemWriterProvider extends MessageBodyWriter[Elem] {
override def isWriteable(cls: Class[_], genericType: Type,
annotations: Array[Annotation],
mediaType: MediaType) = {
classOf[Elem].isAssignableFrom(cls)
}
override def getSize(elem: Elem, cls: Class[_], genericType: Type,
annotations: Array[Annotation], mediaType: MediaType) = {
-1L
}
override def writeTo(elem: Elem, cls: Class[_], genericType: Type,
annotations: Array[Annotation], mediaType: MediaType,
headers: MultivaluedMap[String, Object],
entityStream: OutputStream): Unit = {
println("------- writeTo --------")
entityStream.write(elem.buildString(false).getBytes)
}
}
然后你只需要明确地注册作者或通过扫描来获取它。
另一个选项(不需要自定义提供程序)只是返回XML字符串; - )