Но я пытался понять использование Провайдеров в jax-rs. Но не смог понять, как ContextResolver можно использовать. Может кто-нибудь объяснить это с помощью некоторого базового примера?jax-rs ContextResolver <T> undestanding
ответ
Вы увидите, что он много используется при разрешении объекта контекста сериализации. Например, ObjectMapper
для сериализации JSON. Например
@Provider
@Produces(MediaType.APPLICATION_JSON)
public static JacksonContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public JacksonContextResolver() {
mapper = new ObjectMapper();
}
@Override
public ObjectMapper getContext(Class<?> cls) {
return mapper;
}
}
Теперь то, что будет происходить в том, что поставщик Джексон, а именно JacksonJsonProvider
, когда сериализации, будет первым увидеть, если она была предоставлена ObjectMapper
, если не он будет искать в ContextResolver
для ObjectMapper
и вызвать getContext(classToSerialize)
к получите ObjectMapper
. Так что это действительно возможность, если мы хотим сделать некоторую логику, используя пройденный Class
, чтобы определить, какой из карт (если их несколько) использовать для какого класса. Для меня, как правило, я использую его только для настройки картографа.
Идея состоит в том, что вы можете искать произвольные объекты в базовом контексте. Пример того, как вы могли бы искать ContextResolver
, - через интерфейс для инъекций . Например, в ресурсном классе
@Path("..")
public class Resource {
@Context
private Providers provider;
@GET
public String get() {
ContextResolver<ObjectMapper> resolver
= providers.getContextResolver(ObjectMapper.class, MediaType.APPLICATION_JSON);
ObjectMapper mapper = resolver.getContext(...);
}
}
Это был хороший пример. разве он не может использоваться как завод для создания объектов в зависимости от ввода. –
Вы можете прочитать объяснение в [спецификаторе 4.3 Контекста] (https://jsr311.java.net/nonav/releases/1.1/spec/spec.html). В нем нет подробных сведений о том, для чего он должен использоваться, поэтому я предполагаю, что это используется для общего использования. Если вы можете заставить его работать, используйте его, я думаю. –