Рестлет с использованием пользовательского типа носителя

В Restlet 2.3 (SE) я пытаюсь использовать типы носителей для управления версиями. Моя текущая попытка включает регистрацию новых расширений в моем входящем маршруте:

@Override
public Restlet createInboundRoot() {

        ...
        getTunnelService().setExtensionsTunnel(true);

        getMetadataService().addExtension("vnd.myapp.v1", MediaType.valueOf("application/vnd.myapp.v1+json"));
        getMetadataService().addExtension("vnd.myapp.v2", MediaType.valueOf("application/vnd.myapp.v2+json"));

        ...
}

Интерфейс моего ресурса настраивается следующим образом:

public interface UsersResource {

    @Options
    void getCorsSupport();

    @Get("vnd.myapp.v1")
    Collection<User> representV1() throws Exception;

    // Should be the default if */* is specified
    @Get("json | vnd.myapp.v2")
    Collection<User> representV2() throws Exception;

}

Затем я попытался указать типы носителей следующим образом:

http://localhost:8080/api/users?media=vnd.myapp.v1

Идея состоит в том, что если кто-то указывает тип мультимедиа как vnd.myapp.v1, он получает representV1() (JSON), если он указывает тип мультимедиа как vnd.myapp.v2, он получает representV2() (JSON) и (необязательно), если он не просит ничего конкретного, он получает representV2(). С приведенной выше настройкой независимо от того, что запрашивается, я всегда возвращаю representV2().


person tarka    schedule 08.06.2015    source источник


Ответы (2)


Вот что у меня было при тестировании:

  • Accept: application/vnd.myapp.v1+json -> representV1 вызывается
  • Accept: application/vnd.myapp.v2+json -> representV2 называется
  • Accept: application/application/json -> representV1 называется
  • Accept: */* -> representV1 называется

Кажется, что выражение json | vnd.myapp.v2 работает некорректно. Обходной путь состоит в том, чтобы разделить представительV2 на два метода с json и vnd.myapp.v2.

Когда заголовок accept не указан, кажется, что Restlet вызывает первый найденный метод с аннотацией Get.

Что-то, что может вам помочь, это включить трассировку, чтобы увидеть оценки различных методов:

public class RestletLauncher {
    public static void main(String[] args) {
        Engine.getInstance().setLogLevel(Level.FINEST);
        launchApplication();
    }
}

Вы увидите такие следы:

Score of annotation "MethodAnnotationInfo [javaMethod: public org.restlet.representation.Representation test.MyServerResource1.testGetVnd1(), javaClass: class test.MyServerResource1, restletMethod: GET, input: vnd.myapp.v1, value: vnd.myapp.v1, output: vnd.myapp.v1, query: null]"= 0.5
Total score of variant "[application/vnd.myapp.v1+json]"= 0.04191667
Score of annotation "MethodAnnotationInfo [javaMethod: public org.restlet.representation.Representation test.MyServerResource1.testGetJson(), javaClass: class test.MyServerResource1, restletMethod: GET, input: json, value: json, output: json, query: null]"= 0.5
Total score of variant "[application/json]"= 0.04191667
Score of annotation "MethodAnnotationInfo [javaMethod: public org.restlet.representation.Representation test.MyServerResource1.testGetVnd2(), javaClass: class test.MyServerResource1, restletMethod: GET, input: vnd.myapp.v2, value: vnd.myapp.v2, output: vnd.myapp.v2, query: null]"= 0.5
Total score of variant "[application/vnd.myapp.v2+json]"= 0.04191667

Надеюсь, это поможет вам, Тьерри.

person Thierry Templier    schedule 12.06.2015

Это становится лучше при удалении символа пробела в аннотации, например:

@Get("json|vnd.myapp.v2")

Я создал проблему, чтобы исправить это. https://github.com/restlet/restlet-framework-java/issues/1099

С уважением, Тьерри Буало

person Thierry Boileau    schedule 13.06.2015
comment
проблема исправлена. исправление будет доступно в версии 2.3.3. - person Thierry Boileau; 15.06.2015