Spring Boot 2 | Определение @RequestMapping в интерфейсах - PullRequest
1 голос
/ 30 мая 2019

Я создал простой проект spring-boot-starter-web (v2.1.5), в котором необходимо реализовать классы «контроллера» для интерфейсов @RequestMapping, сгенерированных OpenApi / Swagger

Вот так сгенерированныйИнтерфейс выглядит: -

@Validated
@Api(value = "passbook", description = "the passbook API")
public interface PassbookApi {

    default Optional<NativeWebRequest> getRequest() {
        return Optional.empty();
    }

    @ApiOperation(value = "Get passbook information for a given account number", nickname = "fetchPassbook", notes = "", response = PagedTransactionDetails.class, tags={ "passbook", })
    @ApiResponses(value = { 
        @ApiResponse(code = 200, message = "Passbook information", response = PagedTransactionDetails.class),
        @ApiResponse(code = 400, message = "Bad Request"),
        @ApiResponse(code = 500, message = "Internal Server Error"),
        @ApiResponse(code = 401, message = "Unauthorized") })
    @RequestMapping(value = "/passbook",
        produces = { "application/json" }, 
        method = RequestMethod.GET)
    default ResponseEntity<PagedTransactionDetails> fetchPassbook(@NotNull @ApiParam(value = "Account Number", required = true) @Valid @RequestParam(value = "accountNumber", required = true) String accountNumber,@ApiParam(value = "Offset for transactions to be displayed") @Valid @RequestParam(value = "offset", required = false) Integer offset,@ApiParam(value = "Last transaction serial number") @Valid @RequestParam(value = "transactionSerialNumber", required = false) String transactionSerialNumber,@ApiParam(value = "Last transactionId") @Valid @RequestParam(value = "transactionId", required = false) String transactionId,@ApiParam(value = "Last amount value") @Valid @RequestParam(value = "amountValue", required = false) Integer amountValue) {
        getRequest().ifPresent(request -> {
            for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
                if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
                    ApiUtil.setExampleResponse(request, "application/json", "{  \"txns\" : [ {    \"asdf\" : \"asdf\"  }, {    \"asdf\" : \"asdf\"  } ]}");
                    break;
                }
            }
        });
        return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

    }

}

Это реализация: -

@Slf4j
@Validated
@RestController
@AllArgsConstructor
class PassbookController implements PassbookApi {
    @Override
    public ResponseEntity<PagedTransactionDetails> fetchPassbook(@NotNull @Valid String accountNumber,
                                                                 @Valid Integer offset, @Valid String transactionSerialNumber, @Valid String transactionId, @Valid Integer amountValue) {
        return ResponseEntity.ok(new PagedTransactionDetails()); // !! THIS NEVER GETS INVOKED
    }
}

Метод обработчика запроса вызывается, когда я удаляю часть implements PassbookApi и аннотирую метод с помощью @ RequestMapping

Как заставить его работать, используя implements PassbookApi и не аннотировать метод с помощью @RequestMapping снова в реализующем классе.

Я тестирую с использованием MockMVC

Плагин Maven:-

 <plugin>
                <groupId>org.openapitools</groupId>
                <artifactId>openapi-generator-maven-plugin</artifactId>
                <version>4.0.0</version>
                <executions>
                    <execution>
                        <id>spring-server</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputSpec>${project.basedir}/src/main/resources/account-summary-api.yaml</inputSpec>
                            <generatorName>spring</generatorName>
                            <library>spring-boot</library>
                            <output>${project.build.directory}/generated-openapi/spring</output>
                            <generateApis>true</generateApis>
                            <addCompileSourceRoot>true</addCompileSourceRoot>
                            <artifactVersion>${project.version}</artifactVersion>
                            <groupId>com.x.summary.generated</groupId>
                            <artifactId>account-summary-api</artifactId>
                            <generateApiTests>false</generateApiTests>
                            <modelPackage>com.x.summary.generated.model</modelPackage>
                            <apiPackage>com.x.summary.generated.api</apiPackage>
                            <generateApiDocumentation>true</generateApiDocumentation>
                            <configOptions>
                                <dateLibrary>java8-localdatetime</dateLibrary>
                                <java8>true</java8>
                                <interfaceOnly>true</interfaceOnly>
                                <reactive>false</reactive>
                                <useBeanValidation>true</useBeanValidation>
                                <performBeanValidation>true</performBeanValidation>
                                <useOptional>false</useOptional>
                                <serviceInterface>true</serviceInterface>
                                <serviceImplementation>false</serviceImplementation>
                            </configOptions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
...