-
-
Notifications
You must be signed in to change notification settings - Fork 548
Closed
Labels
invalidThis doesn't seem rightThis doesn't seem rightwontfixThis will not be worked onThis will not be worked on
Description
Describe the bug
Stack:
- Maven 3.8.6
- Java 17
- Spring boot 3.1
- Springdoc: 2.1.0
I have the following Repository interface:
public interface UserRepository extends ListPagingAndSortingRepository<User, Long>, CrudRepository<User, Long> {
@Query(value = "SELECT user FROM User user WHERE user.loginName = :loginNameOrEmail OR user.email = :loginNameOrEmail")
Optional<User> findByLoginNameOrEmail(@Param("loginNameOrEmail") String loginNameOrEmail);
@Query(value = "SELECT user FROM User user WHERE user.loginName = :loginName OR user.email = :email")
Optional<User> findByLoginNameOrEmail(@Param("loginName") String loginName, @Param("email") String email);
}
In pom.xml
I have:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
in application.yml
# ======================================================================
# SPRING DOC CONFIGURATION
# ======================================================================
springdoc:
packagesToScan: com.myapplication.controller
pathsToMatch: /v1/**, /api/**
swagger-ui:
display-request-duration: true
disable-swagger-default-url: true
When I open the application in: http://localhost:8080/swagger-ui/index.html I get the following stack trace:
Caused by: java.lang.IllegalStateException: Ambiguous search mapping detected; Both public abstract java.util.Optional com.myapplication.repository.UserRepository.findByLoginNameOrEmail(java.lang.String,java.lang.String) and public abstract java.util.Optional com.myapplication.repository.UserRepository.findByLoginNameOrEmail(java.lang.String) are mapped to /findByLoginNameOrEmail; Tweak configuration to get to unambiguous paths
at org.springframework.data.rest.core.mapping.SearchResourceMappings.<init>(SearchResourceMappings.java:62)
at org.springframework.data.rest.core.mapping.RepositoryResourceMappings.getSearchResourceMappings(RepositoryResourceMappings.java:119)
at org.springframework.data.rest.core.mapping.RepositoryAwareResourceMetadata.getSearchResourceMappings(RepositoryAwareResourceMetadata.java:147)
at org.springdoc.core.providers.SpringRepositoryRestResourceProvider.findSearchResourceMappings(SpringRepositoryRestResourceProvider.java:360)
at org.springdoc.core.providers.SpringRepositoryRestResourceProvider.getRouterOperations(SpringRepositoryRestResourceProvider.java:276)
at org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$1(OpenApiResource.java:154)
at java.base/java.util.Optional.ifPresent(Optional.java:178)
at org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$2(OpenApiResource.java:153)
Expected behavior
/findByLoginNameOrEmail
is not an URL that exist in any of my controllers. Springdoc is trying to generate endpoints based on data repositories.
I would expect that only com.myapplication.controller
would be scanned for endpoints but spring doc is scanning all the packages from the application.
Even when scanning data repositories, if overloaded methods exist spring doc should be able to resolve this by creating for example:
/findByLoginNameOrEmail-1
/findByLoginNameOrEmail-2
or any other strategy.
Metadata
Metadata
Assignees
Labels
invalidThis doesn't seem rightThis doesn't seem rightwontfixThis will not be worked onThis will not be worked on