Как отправить объект json из клиента REST с помощью javax.ws.rs.client.WebTarget

У меня есть POJO, приведенное ниже, которое я хочу выполнить на сервере как JSON или XML.

Это то, что я сделал

КЛИЕНТ:

ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target(getBaseURI());

public void putFriend(String uri , Friend friend)
{
    System.out.println(friend.toString());

    target = target.path(some_path).path(uri);
    ClientResponse response =        target.request(MediaType.APPLICATION_JSON).put(Entity.entity(friend,MediaType.APPLICATION_JSON),ClientResponse.class);
}

Примеры, которые я нашел в Интернете, используют WebResource.

Я не знаю, как это сделать с помощью WebTarget. То, что я сделал, берется из некоторого примера, найденного в SO, но Entity.entity() дает ошибку undefined метод entity (friend, String).

POJO

@XmlRootElement
public class Friend{

    private String friendURI;
    private String event;
    private String uri;

    String getUri() {
        return uri;
    }
    void setUri(String uri) {
        this.uri = uri;
    }
    String getFriendURI() {
        return friendURI;
    }
    void setFriendURI(String friendURI) {
        this.friendURI = friendURI;
    }
    String getEvent() {
        return event;
    }
    void setEvent(String event) {
        this.event = event;
    }
public String toString() {
        return "Friend [friendURI=" + friendURI + ", uri=" + uri + ", event=" + event
                 + "]";
}

Просьба указать, как это сделать.

Спасибо

Ответы

Ответ 1

Существуют две разные версии Джерси, 1.x и 2.x. Кажется, вы пытаетесь использовать комбинацию обоих, что не сработает. В версиях 2.x нет некоторых классов, как в 1.x и наоборот.

Если вы хотите использовать Jersey 2.x, то вы должны использовать Response, а не ClientResponse

Response response = target.request().put(Entity.json(friend));
                                        // .json == automatic 'application/json'

Основная разбивка.

  • Вызов request() on WebTarget возвращает Invocation.Buidler

    Invocation.Builder builder = target.request();
    
  • Как только мы вызываем put, мы возвращаем Response

    Response response = builder.put(Entity.json(friend));
    
  • Чтобы извлечь из ответа известный тип, мы могли бы использовать readEntity(Class type)

    String responseString = response.readEntity(String.class);
    response.close();