【问题标题】:How to use scala Elem produces jersey text/xml?如何使用 scala Elem 生成球衣文本/xml?
【发布时间】:2015-12-14 11:55:28
【问题描述】:

我已经编写了一个常用的方法来通过 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  
  } 

【问题讨论】:

    标签: xml scala jersey


    【解决方案1】:

    您将需要一个自定义 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 字符串 ;-)

    【讨论】:

    • 谢谢@peeskillet。 是自定义的,并且我已经阅读过了。感谢 scala 版本。此外,Elem.toString 是输出 XML 的直接方式。
    • 是的,如果您只返回字符串,您可以完全避免使用所需的提供程序 :-)
    猜你喜欢
    • 2015-01-22
    • 2016-01-03
    • 1970-01-01
    • 2020-10-09
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多