Java 如何在swagger codegen中注入自定义spring验证?
我们能够使用openApi文档,并使用SpringSwagger代码生成Java输入类。此外,当为常见约束(如长度、强制等)生成输入时,我们可以插入javax.validation注释 我希望将其带到下一个定制级别,并能够使用与Spring的@Constraint annotation连接的定制验证注释对生成的输入类进行注释。通过这种方式,我们可以为我们的项目重用特定的验证 我希望有一个现成的解决方案。使用自定义验证注释生成输入类的首选方法是什么 我没有找到“现成的解决方案”。但openapi生成器提供了一种通过编辑胡须模板修改生成代码的简单方法。我就是这样解决了和你完全一样的问题 基本上,我在OpenAPI规范中创建了自定义字段,在这里我指定了自定义约束注释(@EvenLong)。我将此字段称为“x约束”: 然后我告诉openapi生成器在哪里可以找到我的定制/修改过的胡须模板。我使用openapi生成器作为maven插件,因此我在pom.xml中的插件定义中添加了templateDirectory属性:Java 如何在swagger codegen中注入自定义spring验证?,java,swagger-2.0,swagger-codegen,spring-validator,swagger-codegen-maven-plugin,Java,Swagger 2.0,Swagger Codegen,Spring Validator,Swagger Codegen Maven Plugin,我们能够使用openApi文档,并使用SpringSwagger代码生成Java输入类。此外,当为常见约束(如长度、强制等)生成输入时,我们可以插入javax.validation注释 我希望将其带到下一个定制级别,并能够使用与Spring的@Constraint annotation连接的定制验证注释对生成的输入类进行注释。通过这种方式,我们可以为我们的项目重用特定的验证 我希望有一个现成的解决方案。使用自定义验证注释生成输入类的首选方法是什么 我没有找到“现成的解决方案”。但openapi生
...
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>4.3.1</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>
${project.basedir}/src/main/resources/openapi/specs/petstore.yaml
</inputSpec>
<templateDirectory>
${project.basedir}/src/main/resources/openapi/templates
</templateDirectory>
<generatorName>spring</generatorName>
<apiPackage>sk.matusko.tutorial.openapicustomvalidations.api</apiPackage>
<modelPackage>sk.matusko.tutorial.openapicustomvalidations.model</modelPackage>
<configOptions>
<interfaceOnly>true</interfaceOnly>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
...
第二个mustache模板是model.mustache,它为从openapi规范生成的java模型呈现java导入。因此,我添加了来自ValidatorsJava包(其中@EvenLong是)的所有类的导入。
添加导入com.foo.bar.validators.*;留胡子。我的看起来像这样:
package {{package}};
import java.util.Objects;
{{#imports}}import {{import}};
{{/imports}}
import org.openapitools.jackson.nullable.JsonNullable;
{{#serializableModel}}
import java.io.Serializable;
{{/serializableModel}}
{{#useBeanValidation}}
import javax.validation.Valid;
import com.foo.bar.validators.*;
import javax.validation.constraints.*;
{{/useBeanValidation}}
{{#performBeanValidation}}
import org.hibernate.validator.constraints.*;
{{/performBeanValidation}}
{{#jackson}}
{{#withXml}}
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
{{/withXml}}
{{/jackson}}
{{#withXml}}
import javax.xml.bind.annotation.*;
{{/withXml}}
{{^parent}}
{{#hateoas}}
import org.springframework.hateoas.RepresentationModel;
{{/hateoas}}
{{/parent}}
{{#models}}
{{#model}}
{{#isEnum}}
{{>enumOuterClass}}
{{/isEnum}}
{{^isEnum}}
{{>pojo}}
{{/isEnum}}
{{/model}}
{{/models}}
就这样
这是我的详细教程和代码示例你找到什么好看的方法了吗?救生圈!我已经用kotlin spring对它进行了测试,文件有点变化。您不需要覆盖该目录中的所有文件。即使使用Maven,也不需要覆盖所有内容。谢谢您应该创建关于此的教程。
{{ vendorExtensions.x-constraints }}
{{#pattern}}@Pattern(regexp="{{{pattern}}}") {{/pattern}}{{!
minLength && maxLength set
}}{{#minLength}}{{#maxLength}}@Size(min={{minLength}},max={{maxLength}}) {{/maxLength}}{{/minLength}}{{!
minLength set, maxLength not
}}{{#minLength}}{{^maxLength}}@Size(min={{minLength}}) {{/maxLength}}{{/minLength}}{{!
minLength not set, maxLength set
}}{{^minLength}}{{#maxLength}}@Size(max={{maxLength}}) {{/maxLength}}{{/minLength}}{{!
@Size: minItems && maxItems set
}}{{#minItems}}{{#maxItems}}@Size(min={{minItems}},max={{maxItems}}) {{/maxItems}}{{/minItems}}{{!
@Size: minItems set, maxItems not
}}{{#minItems}}{{^maxItems}}@Size(min={{minItems}}) {{/maxItems}}{{/minItems}}{{!
@Size: minItems not set && maxItems set
}}{{^minItems}}{{#maxItems}}@Size(max={{maxItems}}) {{/maxItems}}{{/minItems}}{{!
@Email: useBeanValidation set && isEmail && java8 set
}}{{#useBeanValidation}}{{#isEmail}}{{#java8}}@javax.validation.constraints.Email{{/java8}}{{/isEmail}}{{/useBeanValidation}}{{!
@Email: performBeanValidation set && isEmail && not java8 set
}}{{#performBeanValidation}}{{#isEmail}}{{^java8}}@org.hibernate.validator.constraints.Email{{/java8}}{{/isEmail}}{{/performBeanValidation}}{{!
check for integer or long / all others=decimal type with @Decimal*
isInteger set
}}{{#isInteger}}{{#minimum}}@Min({{minimum}}){{/minimum}}{{#maximum}} @Max({{maximum}}) {{/maximum}}{{/isInteger}}{{!
isLong set
}}{{#isLong}}{{#minimum}}@Min({{minimum}}L){{/minimum}}{{#maximum}} @Max({{maximum}}L) {{/maximum}}{{/isLong}}{{!
Not Integer, not Long => we have a decimal value!
}}{{^isInteger}}{{^isLong}}{{#minimum}}@DecimalMin({{#exclusiveMinimum}}value={{/exclusiveMinimum}}"{{minimum}}"{{#exclusiveMinimum}},inclusive=false{{/exclusiveMinimum}}){{/minimum}}{{#maximum}} @DecimalMax({{#exclusiveMaximum}}value={{/exclusiveMaximum}}"{{maximum}}"{{#exclusiveMaximum}},inclusive=false{{/exclusiveMaximum}}) {{/maximum}}{{/isLong}}{{/isInteger}}
package {{package}};
import java.util.Objects;
{{#imports}}import {{import}};
{{/imports}}
import org.openapitools.jackson.nullable.JsonNullable;
{{#serializableModel}}
import java.io.Serializable;
{{/serializableModel}}
{{#useBeanValidation}}
import javax.validation.Valid;
import com.foo.bar.validators.*;
import javax.validation.constraints.*;
{{/useBeanValidation}}
{{#performBeanValidation}}
import org.hibernate.validator.constraints.*;
{{/performBeanValidation}}
{{#jackson}}
{{#withXml}}
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
{{/withXml}}
{{/jackson}}
{{#withXml}}
import javax.xml.bind.annotation.*;
{{/withXml}}
{{^parent}}
{{#hateoas}}
import org.springframework.hateoas.RepresentationModel;
{{/hateoas}}
{{/parent}}
{{#models}}
{{#model}}
{{#isEnum}}
{{>enumOuterClass}}
{{/isEnum}}
{{^isEnum}}
{{>pojo}}
{{/isEnum}}
{{/model}}
{{/models}}