Клиент Jax-RS, который делает сообщение с телом запроса строки JSON - PullRequest
0 голосов
/ 05 февраля 2011

Я использую JaxRS для создания клиентского кода, который взаимодействует с API поставщика.Я был в состоянии написать код, который выполняет GET и POST, оба из которых не имеют тела запроса.В настоящее время я сталкиваюсь с проблемой, пытаясь сделать POST, когда отправляется только тело запроса.Я пытаюсь отправить простую строку JSON:

{"server":{"name":"HelloKitty","imageId":71,"flavorId":1}}

Ниже приводится определение используемого веб-клиента (написано на Scala, но я знаю, что заголовки и авторизация выполняются правильно):

def postClient: WebClient = {
   val authClient = WebClient.create(authServer)
   authClient.header("X-Auth-User", apiUsername)
   authClient.header("X-Auth-Key", apiKey)

   val response = authClient.get
   val metadata = response getMetadata () map { case (k, v) => k -> v(0).toString }

   val client = WebClient.create(metadata.get("X-Server-Management-Url").getOrElse("Error in authentication response"))
   client.header("X-Auth-User", apiUsername)
   client.header("X-Auth-Key", apiKey)
   client.header("X-Auth-Token", metadata.get("X-Auth-Token").getOrElse("Error in authentication response"))
   client.header("Content-Type","application/json")
}

Вот мой интерфейс ресурсов:

@Produces(Array("text/json"))
trait RackspaceServerApi {
    @Path("/servers.json")
    @GET
    def listServers(): String

    @Path("/servers/detail.json")
    @GET
    def listServersDetailed(): String

    @POST
    @Path("/servers")
    @Consumes(Array("application/json"))
    def createServerData(server: String)
}

Вот мой метод, который создает прокси и пытается отправить запрос

def createServer(name: String, imageId: Long, flavorId: Int) = {
    // this creates a simple pojo for the server
    val serverObject = new RackspaceCreateServerObject(name, imageId, flavorId, None, None)

    // i am using lift-web to handle the json
    // here I am unmarshalling the serverObject into a json string
    val jsonServerData = write(serverObject)

    val postProxy = JAXRSClientFactory.fromClient(RackspaceConnection.postClient, classOf[RackspaceServerApi], true)
    postProxy.createServerData(jsonServerData)
}

А вотопределенное исключение WebApplicationException, которое я получаю:

Код состояния: [500]
Объект: [Не найден автор тела сообщения для класса ответа: JAXBElement.]

Однако, если я пытаюсь отправить запросиспользование веб-клиента вместо прокси, например, так:

def createServer(name: String, imageId: Long, flavorId: Int) = {
    // this creates a simple pojo for the server
    val serverObject = new RackspaceCreateServerObject(name, imageId, flavorId, None, None)

    // i am using lift-web to handle the json
    // here I am unmarshalling the serverObject into a json string
    val jsonServerData = write(serverObject)

    val webClient = RackspaceConnection.postClient
    webClient.path("/servers")
    webClient.post(jsonServerData)
}

Это работает.Я что-то не так делаю в интерфейсе (отсутствует какая-то волшебная комбинация аннотаций?)?Или я что то не настроил?Я использую Jax-RS 2.3.2.

1 Ответ

0 голосов
/ 17 июля 2011

Какую реализацию JAX-RS вы используете?

Сообщение об ошибке указывает, что вам нужно зарегистрировать плагин / модуль для обработки маршалинга bean-компонентов JAXB в JSON. Некоторые реализации JAX-RS делают это автоматически, некоторые требуют некоторой инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...