gpt4 book ai didi

java - Spring Boot Controller 端点未启用?

转载 作者:行者123 更新时间:2023-12-02 01:49:58 26 4
gpt4 key购买 nike

我继承了一个 Spring Boot 微服务,它没有服务或 API 层,它的行为方式为 HATEOAS 风格。

这不是一个最佳架构,需要改为MVC。

目前,所有存储库方法都是使用@RepositoryRestResource注释直接访问的。

计划进行重构并添加 Controller 和 API 层 (DTO),但是添加 Controller 后,swagger 不显示 Rest Controller 另请注意,在调试 Controller 端点时,实际上并未到达它。它正在被绕过,这是另一个线索。

@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;
}

}

这是 spring swagger 配置

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

}

当我重建并启动服务时, Controller 不显示。它仅显示所有实体及其存储库方法。

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>

有什么想法造成这种情况吗?我在配置中看不到任何其他内容阻止其工作

最佳答案

问题出在您的 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.*")));
}
}

sample 休息 Controller :

@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 看起来像这样;您可以看到 JPA Repository 贡献的 REST API 和 RestController 贡献的 API(/修复路径):

enter image description here

关于java - Spring Boot Controller 端点未启用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53117418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com