加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用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字符串;-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读