如何使用scala Elem生产泽西文/ xml?

时间:2015-12-14 11:55:29

标签: xml scala jersey

我已经编写了一个通过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  
  } 

1 个答案:

答案 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字符串; - )