2016-03-22 2 views
2

Я строю службу RESTful, где предполагается, что конечные точки создаются на основе описания файла ресурсов. Регистрация ресурсов с помощью неявного обработчика конструктора методов работает очень хорошо, однако, когда я пытаюсь заменить явный ящик явным, я нажимаю на стену.Пользовательский джерси Inflector

В приведенном ниже примере я заменил неявный обработчик Inflector явной реализацией ItemInflector. Результат строки ожидается после выполнения.

final Resource.Builder resourceBuilder = Resource.builder(); 
resourceBuilder.path("api/myservice/item"); 
final ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod("GET"); 

methodBuilder.produces(MediaType.TEXT_PLAIN_TYPE) 
    .handledBy(new ItemInflector<ContainerRequestContext, String>(String.class)); 

final Resource resource = resourceBuilder.build(); 
registerResources(resource); 

реализация ItenInflector:

public class ItemInflector<DATA extends ContainerRequestContext, RESULT> implements Inflector<DATA, RESULT> { 

    private Class<RESULT> type; 

    public ItemInflector(Class<RESULT> type) { 
     this.type = type; 
    } 

    @Override 
    public RESULT apply(DATA data) { 
     return type.cast("Half programmatically generated endpoint"); 
    } 
} 

Во время выполнения следующих действий ошибка возникает при попытке ударить конечной точки.

Caused by: java.lang.IllegalArgumentException: Type parameter RESULT not a class or parameterized type whose raw type is a class 

Может кто-то прояснить, что я делаю неправильно в реализации Inflector? Как параметризовать или определить тип РЕЗУЛЬТАТ?

ответ

1

Параметр типа (<ContainerRequestContext, String>), указанный при создании экземпляра ItemInflector, теряется во время выполнения. Причина в том, что поведение Javas type erasure. Вы должны указать тип в подклассе или использовать анонимные классы здесь.

вариант 1, анонимный класс (да, теперь компилятор хранит информацию о типе):

methodBuilder.produces(MediaType.TEXT_PLAIN_TYPE) 
    .handledBy(new Inflector<ContainerRequestContext, String>(){ 
     ... 
    }); 

вариант 2, указать тип в sublcass:

public class ItemInflector implements Inflector<ContainerRequestContext, String> { 
.... 
} 

Вот очень подробная информация о типе стирания поведения: Java generics - type erasure - when and what happens

+0

Не могли бы вы обновить вторых, он сломан. – Maxim

+0

уже сделано :) –

Смежные вопросы