How to use scala elem produces text jersey / xml?

I wrote a generic method for generating an Elem type using scala.xml lib. But Jersey uses JAXB, which means binding xml information to a Java object. How could I just respond with a scala of type Elem, avoiding constructing an object?

Simple code like:

  @GET  
  @Path("sitemap.xml")  
  @Produces(Array(MediaType.APPLICATION_XML))  
  def sitemap( @Context client: DaoService[Future]) = {  
    val x: Elem = Common.defaultXml()  
    x  
  } 
+4
source share
1 answer

For type processing Elemyou will need MessageBodyWriter. This component is what the entire Java object goes through to serialize the response flow. You can read more at JAX-RS Entity Providers . For example, for Elemyou can use something like

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)
  }
}

, .


UPDATE

( ) - XML-; -)

0

Source: https://habr.com/ru/post/1619868/


All Articles