xml - 如何使用 scala Elem 生成 jersey text/xml?

标签 xml scala jersey

我已经编写了一个通用方法来通过 scala.xml 库生成 Elem 类型。但是 Jersey 使用 JAXB,意味着将 xml 信息与 Java 对象绑定(bind)。我怎么能简单地响应 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[_], 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 字符串 ;-)

关于xml - 如何使用 scala Elem 生成 jersey text/xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34266433/

相关文章:

java - 在 pageObject.PartnerNavigationDrawer.Profile 处获取 java.lang.NullPointerException(PartnerNavigationDrawer.java :30) when I call method

json - 如何使用 argonaut 镜头修改 JSON 中的值和类型?

java - JAX-RS/Jersey 2.x 是否利用 servlet 3.0 异步功能?

java - 如何根据每个请求配置 JAX-RS MessageBodyWriter?

java - 在 Jersey 中解析复杂的 JSON 类型

sql - 事务 SQL XQuery XML 查询

c# - DataContractSerializer 序列化到特定的 xml 节点

c# - 将已编辑的 XML 文档保存到任何位置?

multithreading - Slick 2.1/3 执行上下文使用的最佳实践

scala - 如何使用可空列编写光滑的表定义?