spring OpenAPI生成器为已实现的方法返回501

vxbzzdmp  于 2023-05-27  发布在  Spring
关注(0)|答案(1)|浏览(167)

我已经用openAPI生成器maven插件生成了rest API,并且覆盖了MyApiDelegate接口的默认方法,但是/endpoint上的POST请求提供了501 NOT IMPLEMENTED,就好像我没有在MyApiDelegateImpl中给出该方法的实现一样。
Maven插件配置:

<plugin>
                <groupId>org.openapitools</groupId>
                <artifactId>openapi-generator-maven-plugin</artifactId>
                <version>4.3.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <configOptions>
   <inputSpec>${project.basedir}/src/main/resources/latest.yaml</inputSpec>
                            <generatorName>spring</generatorName>
                            <apiPackage>my.rest.api</apiPackage>
                            <modelPackage>my.rest.model</modelPackage>
                       <supportingFilesToGenerate>ApiUtil.java</supportingFilesToGenerate>
                                <delegatePattern>true</delegatePattern>
                                <useBeanValidation>false</useBeanValidation>
                            </configOptions>
                        </configuration>
                    </execution>
                </executions>
</plugin>
/* code generated by plugin */
package my.rest;
public interface MyApiDelegate {
    default Optional<NativeWebRequest> getRequest() {
        return Optional.empty();
    }

    default ResponseEntity<Void> doSmth(Smth smth) {
        return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
    }

}

package my.rest.api;
public interface MyApi {
    default MyApiDelegate getDelegate() {
        return new MyApiDelegate() {};
    }

    /*...Api operations annotations...*/
    @RequestMapping(value = "/endpoint",
        produces = { "application/json" }, 
        consumes = { "application/json", "application/xml" },
        method = RequestMethod.POST)
    default ResponseEntity<Void> doSmth(@ApiParam(value = "" ,required=true) @RequestBody Smth smth) {
        return getDelegate().doSmth(smth);
    }

}

我的实现:

package my.rest.api;
@Service
@RequiredArgsConstructor
public class MyApiDelegateImpl implements MyApiDelegate {
    private final MyService s;

    @Override
    public ResponseEntity<Void> doSmth(Smth smth) {
        s.doIt(smth);
        return ResponseEntity.ok().build();
    }
}

如何让我的程序在具体类中使用我自己的方法实现,而不是interface中提供的default实现?

fdbelqdn

fdbelqdn1#

直接实现MyApi接口以及其中的方法doSmth是一种方法。你的具体类不需要所有与web相关的注解,而只需要像普通方法一样的参数和返回值。
我不明白接口MyApiDelegate是如何初始化的,但是由于getDelegate返回了它的实现,所以调用了doSmth的默认实现,它返回了HttpStatus.NOT_IMPLEMENTED
还有一件需要注意的事情是确保部署知道使用实现类。如果你使用的是spring web,那么仅仅标记你的具体类 @RestController 就足够了。

相关问题