Джерси 2.6. Регистрация провайдера Jackson.
Я реализую веб-сервис REST с помощью Jersey 2.6,
У меня возникли проблемы с регистрацией поддержки Jackson Provider для поддержки JSON, я реализовал ее согласно jeresy документации (https://jersey.java.net/documentation/2.6/user-guide.html#json.jackson).
- Добавить зависимость maven - jersey-media-json-jackson
- Реализован класс ContextResolver.
- Аннотируется с помощью @Provider, чтобы включить "Автоматически открываемые функции"
- web.xml имеет имя пакета классов поставщика, так что поставщики будут регистрироваться во время сканирования.
исх:
http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/
Почему-то провайдер Jackson JSON не зарегистрирован, я что-то пропустил?
Ответы
Ответ 1
Вплоть до Джерси 2.9 эта функция не обнаруживалась автоматически. Нам нужно (1) явно зарегистрировать JacksonFeature
в подклассе Application/ResourceConfig
, (2) перечислить пакет Jackson в web.xml пакетов для сканирования или (3) добавить JacksonFeature в список провайдеров в web.xml
Подкласс приложения:
public class MyApplication extends ResourceConfig {
public MyApplication() {
// (1)
register(JacksonFeature.class); // <----- Jackson Support
packages("the.package.of.your.resources");
}
}
Или web.xml:
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>
org.glassfish.jersey.servlet.ServletContainer
</servlet-class>
<init-param>
<!-- (2) -->
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
the.package.of.your.resources,
org.codehaus.jackson.jaxrs <!-- Jackson providers -->
</param-value>
</init-param>
<init-param>
<!-- (3) -->
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
org.glassfish.jersey.jackson.JacksonFeature
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Подробнее см. здесь, во "Втором выпуске". Обратите внимание, что для свойства ...classnames
, если у вас есть несколько провайдеров для регистрации, вы должны указать его в одном и том же параметре, разделенном запятой, точкой с запятой или символом новой строки.
Да, и просто к вашему сведению, ContextResolver
предназначен только для регистрации ObjectMapper
в извлекаемом контексте, поэтому MessageBodyReader/MessageBodyWriters
может использовать его повторно. Но он не регистрирует фактический MessageBodyReader/Writer
, необходимый для маршаллинга/демаршаллинга.
Ответ 2
Привет, я не думаю, что выше это хорошее решение.
Поскольку я столкнулся с той же проблемой, что и Джерси Спрингбут Джерси, нужно предоставить.
здесь, выше, JacksonFeature.class из Glassfish, у которого меньше возможностей, что будет проблемой для приложения Springboot в будущем
public class MyApplication extends ResourceConfig {
public MyApplication() {
// (1)
register(ObjectMapperContextResolver.class); // <----- Jackson Support
packages("the.package.of.your.resources");
}
}
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.springframework.beans.factory.annotation.Autowired;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
Важно отметить, что вам необходимо импортировать ObjectMapper как com.fasterxml.jackson.databind.ObjectMapper; для последней спрингбут Джексон