У меня есть MessageBodyReader
со следующего класса:Как MessageBodyReader знает, что такое общий тип?
@Provider
@Consumes(MediaType.APPLICATION_JSON)
public class TransactionMessageBodyReader implements MessageBodyReader<Transaction<Customer>>
boolean isReadable(Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType)
И у меня есть следующий REST конечной точки:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("trans")
public Response checkStatus(Transaction<Customer> transaction) { ... }
В моем отладчике у меня есть точки останова на isReadable
и она попадает в точку останова перед вызовом checkStatus
способ. До сих пор хорошо. Я вижу в своем отладчике, что genericType
говорит Transaction<Customer>
... другими словами, он знает информацию о типе. Как он может знать информацию о типе, когда стирание стилей Java стирает его, чтобы быть только Transaction
во время выполнения? Я вижу, что genericType
состоит из ParameterizedType
, который, как мне кажется, используется для передачи информации о типе вокруг (чтобы обойти проблему стирания типа). Однако, как Джерси заполняет genericType
автоматически? Потому что я никогда не указывал информацию о типе, кроме заголовков методов, которые я опубликовал выше.
Кроме того, второй вопрос: если «автоматически» Джерси так много знает о моих типах, зачем мне вообще нужен MessageBodyReader
? Не существует ли более простой способ использования дженериков с конечными точками Джерси/REST и заставить его «просто работать»?
На самом деле, это происходит потому, что есть 'реализация MessageBodyReader', что она волшебным образом работает. См. Также http://stackoverflow.com/questions/19860393/java-generics-obtaining-actual-type-of-generic-parameter – Tunaki
@Tunaki Я знаю, но почему? Как MessageBodyReader действительно знает информацию о типе? (Это также стирается тип - правильно?). – KyleM
Я подозреваю, что это использование стандартного трюка: стирание стилей стирает дженерики от _объектов_, но не _classes_. –