Nano Hash - криптовалюты, майнинг, программирование

com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector не найден при использовании Swagger

мой первый пост на SO и ожидание хороших вещей взамен :-)

Я разработал небольшое приложение для отдыха на Java и интегрировал его с Swagger. У меня есть архитектура @Controller -> @Service -> @Repository. Я развернул на Glassfish (4.1.1), когда я использую «Расширенный клиент отдыха» Chrome, я могу отлично отправлять и получать вызовы отдыха (GET/POST и т. д.), но когда я использую Swagger, он выдает следующее исключение: после того, как контроллер вернет правильный ответ».

Я боролся с этим, изменив версии записи maven, изменив moxy jar, удалив felix, как это было предложено на некоторых форумах и т. д., но, похоже, никто не помогает.

Вот подробнее...

Исключение:

  StandardWrapperValve[com.xxx.config.ApplicationConfig]: Servlet.service() for servlet com.xxx.config.ApplicationConfig threw exception
java.lang.ClassNotFoundException: com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found by com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider [130]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

Код:

@Controller
@Path("/document")
@Api(value = "/document", description = "Document Controller ")
public class DocumentController {

    @Inject
    DocumentService documentService;

    @GET
    @Path("/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Get Document.", notes = "Get Document Call")
    @ApiResponses(value = { @ApiResponse(code = 200, message = "OK"),
            @ApiResponse(code = 500, message = "Something wrong in Server") })
    public DtoDocument getDocument(@PathParam("id") Integer docId) {
        Document doc = documentService.getDocument(docId);
        DtoDocument dto = toDto(doc);
        return dto;
    }
}

@Service
@Transactional
public class DocumentService {

    @Inject
    DocumentRepository repository;

    public Document getDocument(Integer id) {
        return repository.getDocumentById(id);
    }

}

@Repository
public class DocumentRepository {

    public static final String COLLECTION_NAME = "document";

    @Inject
    private MongoTemplate mongoTemplate;

    public Document getDocumentById(Integer Id) {
        Document doc = getMongoTemplate().findOne(Query.query(Criteria.where("id").is(Id)), Document.class, COLLECTION_NAME);
        return doc;
    }

}

@ApplicationPath("/rest")
public class ApplicationConfig extends Application {

    @Override
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet();

        resources.add(com.wordnik.swagger.jaxrs.listing.ApiListingResource.class);
        resources.add(com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider.class);
        resources.add(com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON.class);
        resources.add(com.wordnik.swagger.jaxrs.listing.ResourceListingProvider.class);

        addRestResourceClasses(resources);

        return resources;
    }

    private void addRestResourceClasses(Set<Class<?>> resources) {
        // Custom resources in the project (all restful services)
        resources.add(com.xxx.web.rest.DocumentController.class);
    }

}

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    bean-discovery-mode="all">
</beans>

чванливая запись в pom.xml

<dependency>
            <groupId>com.wordnik</groupId>
            <artifactId>swagger-jersey-jaxrs_2.10</artifactId>
            <version>1.3.13</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jersey.contribs</groupId>
                    <artifactId>jersey-spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-client</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-server</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-servlet</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.sun.jersey</groupId>
                    <artifactId>jersey-multipart</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.codehaus.jackson</groupId>
                    <artifactId>jackson-mapper-asl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.module</groupId>
                    <artifactId>jackson-module-jaxb-annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

Спасибо, если кто-нибудь может сказать мне, в чем именно проблема ... это была разочаровывающая неделя, и я застрял в этом, не добившись никакого прогресса.


Ответы:


1

Трассировка стека упоминает: java.lang.ClassNotFoundException: com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found by com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider

и вы исключаете модуль аннотации JAXB:

<exclusion>
   <groupId>com.fasterxml.jackson.module</groupId>
   <artifactId>jackson-module-jaxb-annotations</artifactId>
</exclusion>

Исключение означает, что зависимость не разрешена, поэтому вы получите ClassNotFoundException

21.02.2016
  • На самом деле я пытался не исключать и добавлять jackson-module-jaxb-annotations-2.7.1.jar в каталог Glassfish/modules. Оба не работали. 21.02.2016
  • для меня самый большой вопрос: почему то же самое будет работать для другого клиента для отдыха, а не для Swagger, что заставляет меня думать, что у Swagger есть свой собственный маршрут, и я каким-то образом обхожу путь к классу Glassfish .. шанс? Я имею в виду, что у него могут быть свои собственные аннотации jackson-module-jaxb, которые все еще переопределяют файл jar стеклянной рыбы... 21.02.2016

  • 2

    Это сработало для меня:

    Шаги: домен 1-Stop

    2-Удалите содержимое этой папки: Glassfish\glassfish\domains\DOMAIN_NAME\osgi-cache\felix

    3-В этой папке: C:\Glassfish\glassfish\modules Замените библиотеки jackson версией 2.4.4:

    Джексон-модуль-jaxb-аннотации-2.4.4

    Джексон-jaxrs-json-провайдер-2.4.4

    Джексон-jaxrs-база-2.4.4

    Джексон-привязка данных-2.4.4

    Джексон-аннотации-2.4.4

    Джексон-ядро-2.4.4

    4-стартовый домен

    Я надеюсь, что это помогает :-)

    28.02.2017

    3

    Я не знаю, относится ли это также к 4.1.1, но Glassfish 4.1 поставлялся со старой версией Jackson, и это было причиной проблемы, о которой вы говорили выше.

    Чтобы решить эту проблему, вам нужно заставить Glassfish загрузить как минимум версию Jackson 2.4.5, что является минимальным требованием для swagger-core. Обновление Джексона в GlassFish 4.1 охватывает эту процедуру.

    22.02.2016
  • спасибо за комментарий .. однако я попытался поместить файлы jar в каталог модулей, очистить felix & bounce GF, но проблема осталась прежней. Я даже изменил «asadmin», чтобы передать путь к классам с последними файлами jar, он по-прежнему переопределяет путь к классам со старыми версиями, которые Swagger использует внутри. Я пробовал так... 23.02.2016
  • export RUNTIME_CLASSPATH=/Users/xxx/Software/glassfish4/glassfish/modules/jackson-module-jaxb-annotations-2.7.1.jar export RUNTIME_CLASSPATH=$RUNTIME_CLASSPATH:/Users/xxx/Software/glassfish4/glassfish/modules/jackson- core-2.7.1.jar экспорт RUNTIME_CLASSPATH=$RUNTIME_CLASSPATH:$CLASSPATH exec $JAVA -cp RUNTIME_CLASSPATH -jar $AS_INSTALL_LIB/client/appserver-cli.jar $@ 23.02.2016
  • Боюсь не знаю как заставить GF подцепить версию. Есть ли способ проверить, какая версия Джексона загружена? Ошибка, которую вы получаете, является убедительным признаком того, что это неправильная версия (старая, поскольку Джексон в основном обратно совместим). 23.02.2016
  • Рон, на самом деле это сработало после изменения пути к классам, как я упоминал выше. 24.02.2016
  • Это относится и к 4.1.1. Я решил это, заменив поставленную банку на org.eclipse.persistence.moxy-2.7.0.jar. 18.12.2017

  • 4

    Добавить 2 зависимости - у меня сработало

       <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-jaxb-annotations</artifactId>
            <version>2.10.1</version>
        </dependency>
    
    
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.fasterxml.jackson.module</groupId>
                    <artifactId>jackson-module-jaxb-annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    
    30.01.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..