Конечные точки контроллера весенней загрузки не включены? - PullRequest
0 голосов
/ 02 ноября 2018

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

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

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

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

@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();

}

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

enter image description here

Зависимости 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>

Есть идеи, что вызывает это? В конфиге больше ничего не видно, что мешает этому работать

1 Ответ

0 голосов
/ 02 ноября 2018

Проблема связана с вашим 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 UI выглядит следующим образом; вы можете увидеть как API REST, предоставленные репозиторием JPA, так и API, добавленный RestController (/ fixing path):

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...