webTarget.request возвращает тип, неприемлемый для builder.method - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь протестировать функцию API REST.

    builder = webTarget.request();

возвращает конструктор типа

javax.ws.rs.client.Invocation.Builder

Но если я возьму этот строитель и вызову builder.method ("POST", entity), вызываемый метод выглядит так:

    public Response method(final String name, final Entity<?> entity) throws ProcessingException {
        requestContext.setMethod(name);
        storeEntity(entity);
        return new JerseyInvocation(this).invoke();
    }

И последняя строка использует в качестве «этого» другого строителя:

org.glassfish.jersey.client.JerseyInvocation.Builder

И на этой линии сбой запускается.

Я смотрю на это и чувствую себя сумасшедшим: как могло случиться, что функция вызывается как член одного класса, но когда «this» используется в этом методе, используется совершенно другой класс?

1 Ответ

0 голосов
/ 29 апреля 2018

Оба Invocation и Invocation.Builder являются интерфейсами. WebTarget.request() контракт должен вернуть Invocation.Builder. Это все интерфейсы, о которых мы здесь говорим; WebTarget, Invocation, Invocation.Builder. Это контрактный проект по спецификации JAX-RS. Это реализация JAX-RS для реализации этих интерфейсов. Реализация на Джерси: JerseyWebTarget, JerseyInvocation и JerseyInvociation.Builder соответственно.

То же самое, если я создал что-то вроде этого

public interface Model {}

public interface Service {
    Model getModel();
}

public ModelImpl implements Model {}

public class ServiceImpl implements Service {
    @Override
    public Model getModel() {
        return new ModelImpl();
    }
}

Здесь нет ничего особенного. Контракт Service говорит, что метод getModel() возвращает Model, который является интерфейсом, фактическое возвращаемое значение будет иметь тип ModelImpl, реализацию. Полиморфизм в работах.

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