Подтвердить что ты не робот

Джерси 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 не зарегистрирован, я что-то пропустил?

4b9b3361

Ответ 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; для последней спрингбут Джексон