Что вы можете сделать, так это создать MessageBodyReader/Writer
, который обрабатывает версию Джексона 2.x. Методы isReadable
и isWritable
определяют, какие объекты он может обрабатывать. Что вы можете сделать, чтобы проверить, так это внедрить ExtendedUriInfo
Джерси в провайдер и проверить класс ресурсов для вашей аннотации @Jackson2
. Если аннотация отсутствует, ваш провайдер игнорирует сущность, а среда выполнения переходит к следующему провайдеру и проверяет, может ли он ее обработать; в данном случае поставщик 1.x.
Вместо того, чтобы полностью создавать свой собственный, вы бы просто расширили провайдера, который Джексон уже предоставляет в своем артефакте.
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.9.2</version>
</dependency>
Вы бы расширили JacksonJaxbJsonProvider
.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Jackson2 {
}
@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class MyProvider extends JacksonJaxbJsonProvider {
@Context
private ExtendedUriInfo info;
@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
if (!info.getMatchedMethod().getDeclaringResource().isAnnotationPresent(Jackson2.class)) {
return false;
}
return super.isReadable(type, genericType, annotations, mediaType);
}
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
if (!info.getMatchedMethod().getDeclaringResource().isAnnotationPresent(Jackson2.class)) {
return false;
}
return super.isWriteable(type, genericType, annotations, mediaType);
}
}
Затем просто аннотируйте свои классы ресурсов с помощью @Jackson2
.
Раньше у меня были проблемы, когда я пытался заставить это работать, потому что я использовал Jackson 2.8.4. Похоже, что вся линейка 2.8 имеет проблемы. Не уверен, что это такое, но с 2.8 мой провайдер вообще не регистрировался. Я тестировал минорные версии 2.2-2.9 (кроме 2.8), и все они работают.
Что касается приоритета, я не уверен, как Джерси определяет приоритет. Если бы сначала вызывался провайдер 1.x, то все это решение развалилось бы. Один из способов обойти это - использовать композицию вместо наследования, где вы просто определяете, какой модуль чтения/записи (1.x или 2.x) использовать внутри ваших методов readFrom
и writeTo
. Версия 1.x тоже JacksonJaxbJsonProvider
, но в ней использовалась упаковка codehaus
. Однако из того, что я тестировал, мой провайдер всегда вызывается первым, так что это может не понадобиться. К сожалению, я не могу подтвердить, что это сделано специально.
person
Paul Samsotha
schedule
03.11.2017
Annotation[]
, чтобы увидеть, присутствует ли ваша аннотация@UseJackson2
или нет. Это просто идея. Не то, что я пробовал. - person Paul Samsotha   schedule 02.11.2017void put(@Jackson2 TheType deserializeMe)
. Таким образом, код будет легко загрязняться, поскольку аннотацию придется помещать в каждый параметр полезной нагрузки. (И как применить ее к ответу?) Или я что-то не так понял. В любом случае интересная находка. - person Michał Wróbel   schedule 02.11.2017ResourceInfo
, которые вы можете ввести. Я мало работаю с 1.x, поэтому не уверен. - person Paul Samsotha   schedule 02.11.2017@Context ExtendedUriInfo
в программу чтения/записи. Там вы можете получить всю необходимую информацию. - person Paul Samsotha   schedule 02.11.2017if (info.getMatchedMethod().getDeclaringResource().isAnnotationPresent(Jackson2.class)
- person Paul Samsotha   schedule 02.11.2017isReadable
иisWritable
. Верните false, если аннотация отсутствует, или верните супервызов. Я играю с этим прямо сейчас. Пытаюсь работать. - person Paul Samsotha   schedule 02.11.2017