我已经用openAPI生成器maven插件生成了rest api,我已经覆盖了MyApiDelegate
接口的默认方法,但是/endpoint
上的POST请求提供了501 NOT实现,就好像我没有在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();
}
}
如何使程序在具体类中使用我自己的方法实现,而不是默认的实现,它在接口中提供?
直接实现MyApi
接口,从而实现doSmth
方法这是一种方法。你的具体类不需要所有与web相关的注释,只需要参数和返回值,就像一个普通的方法。
我不明白如何可以初始化接口MyApiDelegate
,但由于getDelegate
返回它的实现,因此调用doSmth
的默认实现,返回HttpStatus.NOT_IMPLEMENTED
。
另一件需要注意的事情是确保部署知道使用实现类。如果你正在使用spring web,那么仅仅标记你的具体类@RestController就足够了。