如何使用scala Elem生产泽西文/ xml?
发布时间:2020-12-16 19:23:19 所属栏目:安全 来源:网络整理
导读:我已经编写了一个通过 scala.xml lib生成Elem类型的常用方法.但是Jersey使用JAXB,意味着用 Java对象绑定xml信息.我怎么能简单地用scala的Elem类型响应,避免构造一个对象? 简单代码为: @GET @Path("sitemap.xml") @Produces(Array(MediaType.APPLICATION_XM
我已经编写了一个通过
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 } 解决方法
您将需要一个自定义
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[_],mediaType: MediaType) = { -1L } override def writeTo(elem: Elem,mediaType: MediaType,headers: MultivaluedMap[String,Object],entityStream: OutputStream): Unit = { println("------- writeTo --------") entityStream.write(elem.buildString(false).getBytes) } } 然后你只需要显式注册编写器或通过扫描拾取它. UPDATE 另一个选项(不需要自定义提供程序)只是返回XML字符串;-) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |