Skip to content

Ambiguous search mapping detected;  #2304

@ffroliva

Description

@ffroliva

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

No one assigned

    Labels

    invalidThis doesn't seem rightwontfixThis will not be worked on

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions