如何使用scala Elem 生成球衣text/xml?
How to use scala Elem produces jersey text/xml?
我已经写了一个通用的方法来通过scala.xml lib生成Elem类型。但是 Jersey 使用 JAXB,意味着将 xml 信息与 Java 对象绑定。我怎么能简单地使用 scala 的 Elem 类型来避免构造对象呢?
简单代码为:
@GET
@Path("sitemap.xml")
@Produces(Array(MediaType.APPLICATION_XML))
def sitemap( @Context client: DaoService[Future]) = {
val x: Elem = Common.defaultXml()
x
}
您将需要一个自定义 MessageBodyWriter
to handle the Elem
type. This component is what all Java object go through to serialize to the response stream. You can read more at 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)
}
}
那你要么显式注册写手,要么让扫码获取。
更新
另一个选项(不需要自定义提供程序)是简单地 return XML 字符串 ;-)
我已经写了一个通用的方法来通过scala.xml lib生成Elem类型。但是 Jersey 使用 JAXB,意味着将 xml 信息与 Java 对象绑定。我怎么能简单地使用 scala 的 Elem 类型来避免构造对象呢?
简单代码为:
@GET
@Path("sitemap.xml")
@Produces(Array(MediaType.APPLICATION_XML))
def sitemap( @Context client: DaoService[Future]) = {
val x: Elem = Common.defaultXml()
x
}
您将需要一个自定义 MessageBodyWriter
to handle the Elem
type. This component is what all Java object go through to serialize to the response stream. You can read more at 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)
}
}
那你要么显式注册写手,要么让扫码获取。
更新
另一个选项(不需要自定义提供程序)是简单地 return XML 字符串 ;-)