Arhn - архитектура программирования

Конечные точки контроллера загрузки Spring не включены?

Я унаследовал микросервис Spring Boot, у которого нет уровня службы или API, он ведет себя в стиле HATEOAS.

Это не оптимальная архитектура, и ее необходимо изменить на MVC.

В настоящее время доступ ко всем методам репозитория осуществляется напрямую с помощью аннотации @RepositoryRestResource.

План состоит в том, чтобы реорганизовать это и добавить контроллеры и уровень API (DTO), однако после добавления контроллера swagger не показывает остальные контроллеры. Также следует отметить, что при отладке конечной точки контроллера она фактически не достигается. Его обходят, что является еще одной подсказкой.

@CrossOrigin
@RestController
@RequestMapping("/fixing")
public class FixingController {

  private final FixingRepository fixingRepository;

  @Autowired
  FixingController(final FixingRepository fixingRepository) {
    this.fixingRepository = checkNotNull(fixingRepository, "Fixing Repository cannot be null");
  }

  /**
   * Builds a list of Fixing strings from the database
   * @return list
   */
  @RequestMapping(value = "/", method = RequestMethod.GET)
  public List<String> getAllFixings() {

    final List<String> fixingList = new ArrayList<>();
    for (Fixing fixing : fixingRepository.findAll()) {
      String name = fixing.getName();
      fixingList.add(name);
    }
    return fixingList;
  }

}

Это конфигурация весеннего чванства

@Configuration
public class SwaggerConfig {

@Bean
public Docket api() {

return new Docket(DocumentationType.SWAGGER_2)
  .select()
  .apis(RequestHandlerSelectors.any())
  .paths(PathSelectors.regex("/api.*"))
  .build();
 } 
}

Репозиторий (обратите внимание на отсутствие аннотации @RepositoryRestResource)

public interface FixingRepository extends JpaRepository<Fixing, Long> {

  @Override
  Fixing findOne(Long id);

  @Override
  List<Fixing> findAll();

}

Когда я перестраиваю и запускаю службу, контроллер не отображается. Он показывает только все объекты и их методы репозитория.

введите здесь описание изображения

зависимости POM

 <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--  included explicitly to avoid javadoc generation error
              due to a conflict with a class used by @Transactional annotation -->
        <dependency>
            <groupId>javax.interceptor</groupId>
            <artifactId>javax.interceptor-api</artifactId>
            <version>1.2</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>8.0.12</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>


        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.8.0</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-data-rest</artifactId>
            <version>2.8.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>1.5.13.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180130</version>
        </dependency>

        <dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-52</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
        </dependency>

        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
            <version>3.6.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-gcp-starter-storage</artifactId>
            <version>1.0.0.RELEASE</version>
        </dependency>

    </dependencies>

Любые идеи, что вызывает это? Я ничего не вижу в конфигурации, что мешает этому работать

02.11.2018

  • Не могли бы вы предоставить свой файл pom.xml (если вы используете Maven)? 02.11.2018
  • @ArunPatra добавил список зависимостей POM 02.11.2018

Ответы:


1

Проблема связана с вашим SwaggerConfig. Вы выбираете только подмножество своих API (либо из репозитория JPA, либо из вашего RestController) с помощью этого:

.paths(PathSelectors.regex("/api.*"))

Я воспроизвел ваш сценарий и просто прокомментировал выбор пути, и я вижу оба типа API. Обратите внимание, что вы также можете использовать настраиваемый предикат для выбора путей:

@Configuration
@Import({SpringDataRestConfiguration.class})
public class SwaggerConfig {

    @Autowired
    @SuppressWarnings({"UnusedDeclaration"})
    private ServletContext servletContext;

    @Bean
    public Docket api() {

        return new Docket(DocumentationType.SWAGGER_2)
                .pathProvider(relativePath())
                .select()
                .apis(RequestHandlerSelectors.any())
//                .paths(paths2())
                .build();
    }
    // Select only a few
    private Predicate<String> paths2() {
        return and(
                (regex("/fixing.*")),
                (regex("/api.*")));
    }
    // Exclude these 
    private Predicate<String> paths() {
        return and(
                not(regex("/error.*")),
                not(regex("/metrics.*")),
                not(regex("/jolokia.*")),
                not(regex("/health.*")),
                not(regex("/env.*")),
                not(regex("/metrics.*")),
                not(regex("/info.*")),
                not(regex("/mappings.*")),
                not(regex("/trace.*")),
                not(regex("/dump.*")),
                not(regex("/heapdump.*")),
                not(regex("/configprops.*")),
                not(regex("/beans.*")),
                not(regex("/autoconfig.*")),
                not(regex("/logfile.*")),
                not(regex("/shutdown.*")),
                not(regex("/actuator.*")));
    }
}

Пример контроллера отдыха:

@CrossOrigin
@RestController
@RequestMapping("/fixing")
public class FixingController {

    /**
     * Builds a list of Fixing strings from the database
     * @return list
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public List<String> getAllFixingsViaRestController() {

        final List<String> fixingList = new ArrayList<>();
        fixingList.add("foo");
        fixingList.add("bar");

        return fixingList;
    }

}

Теперь мой пользовательский интерфейс Swagger выглядит так: вы можете увидеть как API-интерфейсы REST, предоставленные репозиторием JPA, так и API-интерфейс, предоставленный RestController (путь /fixing):

введите здесь описание изображения

02.11.2018
  • @tomaytotomato, если это сработало для вас, не могли бы вы принять это как ответ? Вы увидите возможность сделать это. 02.11.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..