diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaMicronautAbstractCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaMicronautAbstractCodegen.java index 0210abad942..e90fcfd5d6c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaMicronautAbstractCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaMicronautAbstractCodegen.java @@ -1,5 +1,8 @@ package org.openapitools.codegen.languages; +import com.google.common.collect.ImmutableMap; +import com.samskivert.mustache.Mustache; +import com.samskivert.mustache.Template; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.media.Schema; import org.apache.commons.lang3.StringUtils; @@ -15,6 +18,8 @@ import org.openapitools.codegen.model.OperationsMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.io.Writer; import java.util.*; import java.util.stream.Collectors; @@ -692,4 +697,17 @@ public abstract class JavaMicronautAbstractCodegen extends AbstractJavaCodegen i } return escapeText(text).replaceAll("'", "\\'"); } + + @Override + protected ImmutableMap.Builder addMustacheLambdas() { + return super.addMustacheLambdas() + .put("replaceDotsWithUnderscore", new ReplaceDotsWithUnderscoreLambda()); + } + + private static class ReplaceDotsWithUnderscoreLambda implements Mustache.Lambda { + @Override + public void execute(final Template.Fragment fragment, final Writer writer) throws IOException { + writer.write(fragment.execute().replace('.', '_')); + } + } } diff --git a/modules/openapi-generator/src/main/resources/java-micronaut/client/api.mustache b/modules/openapi-generator/src/main/resources/java-micronaut/client/api.mustache index ff04dfd1f68..22bc78e27b5 100644 --- a/modules/openapi-generator/src/main/resources/java-micronaut/client/api.mustache +++ b/modules/openapi-generator/src/main/resources/java-micronaut/client/api.mustache @@ -48,10 +48,12 @@ public interface {{classname}} { {{#operation}} {{>common/operationAnnotations}}{{! }} @{{#lambda.pascalcase}}{{#lambda.lowercase}}{{httpMethod}}{{/lambda.lowercase}}{{/lambda.pascalcase}}(uri="{{{path}}}") - {{#vendorExtensions.x-content-type}} - @Produces(value={"{{vendorExtensions.x-content-type}}"}) - {{/vendorExtensions.x-content-type}} - @Consumes(value={"{{vendorExtensions.x-accepts}}"}) + {{#hasProduces}} + {{#produces}}{{#-first}}@Consumes({{openbrace}}{{/-first}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{#-last}}{{closebrace}}){{/-last}}{{/produces}} + {{/hasProduces}} + {{#hasConsumes}} + {{#consumes}}{{#-first}}@Produces({{openbrace}}{{/-first}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{#-last}}{{closebrace}}){{/-last}}{{/consumes}} + {{/hasConsumes}} {{!auth methods}} {{#configureAuth}} {{#authMethods}} diff --git a/modules/openapi-generator/src/main/resources/java-micronaut/client/auth/AuthorizationBinder.mustache b/modules/openapi-generator/src/main/resources/java-micronaut/client/auth/AuthorizationBinder.mustache index 7dc1814c237..14329a506cb 100644 --- a/modules/openapi-generator/src/main/resources/java-micronaut/client/auth/AuthorizationBinder.mustache +++ b/modules/openapi-generator/src/main/resources/java-micronaut/client/auth/AuthorizationBinder.mustache @@ -4,6 +4,7 @@ package {{invokerPackage}}.auth; import io.micronaut.aop.MethodInvocationContext; import io.micronaut.core.annotation.AnnotationValue; import io.micronaut.core.annotation.NonNull; +import io.micronaut.core.naming.NameUtils; import io.micronaut.core.util.CollectionUtils; import io.micronaut.core.util.StringUtils; import io.micronaut.http.MutableHttpRequest; @@ -47,26 +48,6 @@ public class AuthorizationBinder implements AnnotatedClientRequestBindermicronaut-validation compile + + io.micronaut.xml + micronaut-jackson-xml + compile + io.micronaut micronaut-inject-groovy diff --git a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/AnotherFakeApi.java b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/AnotherFakeApi.java index 347defb034a..9aa8dbcee11 100644 --- a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/AnotherFakeApi.java +++ b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/AnotherFakeApi.java @@ -38,8 +38,8 @@ public interface AnotherFakeApi { * @return ModelClient */ @Patch(uri="/another-fake/dummy") - @Produces(value={"application/json"}) - @Consumes(value={"application/json"}) + @Consumes({"application/json"}) + @Produces({"application/json"}) Mono call123testSpecialTags( @Body @NotNull @Valid ModelClient _body ); diff --git a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeApi.java b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeApi.java index c09015a9935..bf573e43dff 100644 --- a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeApi.java +++ b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeApi.java @@ -45,8 +45,7 @@ public interface FakeApi { * @param xmlItem XmlItem Body (required) */ @Post(uri="/fake/create_xml_item") - @Produces(value={"application/xml"}) - @Consumes(value={"application/json"}) + @Produces({"application/xml", "application/xml; charset=utf-8", "application/xml; charset=utf-16", "text/xml", "text/xml; charset=utf-8", "text/xml; charset=utf-16"}) Mono createXmlItem( @Body @NotNull @Valid XmlItem xmlItem ); @@ -58,8 +57,7 @@ public interface FakeApi { * @return Boolean */ @Post(uri="/fake/outer/boolean") - @Produces(value={"*/*"}) - @Consumes(value={"*/*"}) + Mono fakeOuterBooleanSerialize( @Body @Nullable Boolean _body ); @@ -71,8 +69,7 @@ public interface FakeApi { * @return OuterComposite */ @Post(uri="/fake/outer/composite") - @Produces(value={"*/*"}) - @Consumes(value={"*/*"}) + Mono fakeOuterCompositeSerialize( @Body @Nullable @Valid OuterComposite _body ); @@ -84,8 +81,7 @@ public interface FakeApi { * @return BigDecimal */ @Post(uri="/fake/outer/number") - @Produces(value={"*/*"}) - @Consumes(value={"*/*"}) + Mono fakeOuterNumberSerialize( @Body @Nullable BigDecimal _body ); @@ -97,8 +93,7 @@ public interface FakeApi { * @return String */ @Post(uri="/fake/outer/string") - @Produces(value={"*/*"}) - @Consumes(value={"*/*"}) + Mono fakeOuterStringSerialize( @Body @Nullable String _body ); @@ -109,8 +104,7 @@ public interface FakeApi { * @param _body (required) */ @Put(uri="/fake/body-with-file-schema") - @Produces(value={"application/json"}) - @Consumes(value={"application/json"}) + @Produces({"application/json"}) Mono testBodyWithFileSchema( @Body @NotNull @Valid FileSchemaTestClass _body ); @@ -122,8 +116,7 @@ public interface FakeApi { * @param _body (required) */ @Put(uri="/fake/body-with-query-params") - @Produces(value={"application/json"}) - @Consumes(value={"application/json"}) + @Produces({"application/json"}) Mono testBodyWithQueryParams( @QueryValue(value="query") @NotNull String query, @Body @NotNull @Valid User _body @@ -137,8 +130,8 @@ public interface FakeApi { * @return ModelClient */ @Patch(uri="/fake") - @Produces(value={"application/json"}) - @Consumes(value={"application/json"}) + @Consumes({"application/json"}) + @Produces({"application/json"}) Mono testClientModel( @Body @NotNull @Valid ModelClient _body ); @@ -163,8 +156,7 @@ public interface FakeApi { * @param paramCallback None (optional) */ @Post(uri="/fake") - @Produces(value={"application/x-www-form-urlencoded"}) - @Consumes(value={"application/json"}) + @Produces({"application/x-www-form-urlencoded"}) Mono testEndpointParameters( @NotNull @DecimalMin("32.1") @DecimalMax("543.2") BigDecimal number, @NotNull @DecimalMin("67.8") @DecimalMax("123.4") Double _double, @@ -196,8 +188,7 @@ public interface FakeApi { * @param enumFormString Form parameter enum test (string) (optional, default to -efg) */ @Get(uri="/fake") - @Produces(value={"application/x-www-form-urlencoded"}) - @Consumes(value={"application/json"}) + @Produces({"application/x-www-form-urlencoded"}) Mono testEnumParameters( @Header(name="enum_header_string_array") @Nullable List enumHeaderStringArray, @Header(name="enum_header_string", defaultValue="-efg") @Nullable String enumHeaderString, @@ -221,7 +212,6 @@ public interface FakeApi { * @param int64Group Integer in group parameters (optional) */ @Delete(uri="/fake") - @Consumes(value={"application/json"}) Mono testGroupParameters( @QueryValue(value="required_string_group") @NotNull Integer requiredStringGroup, @Header(name="required_boolean_group") @NotNull Boolean requiredBooleanGroup, @@ -237,8 +227,7 @@ public interface FakeApi { * @param param request body (required) */ @Post(uri="/fake/inline-additionalProperties") - @Produces(value={"application/json"}) - @Consumes(value={"application/json"}) + @Produces({"application/json"}) Mono testInlineAdditionalProperties( @Body @NotNull Map param ); @@ -250,8 +239,7 @@ public interface FakeApi { * @param param2 field2 (required) */ @Get(uri="/fake/jsonFormData") - @Produces(value={"application/x-www-form-urlencoded"}) - @Consumes(value={"application/json"}) + @Produces({"application/x-www-form-urlencoded"}) Mono testJsonFormData( @NotNull String param, @NotNull String param2 @@ -267,7 +255,6 @@ public interface FakeApi { * @param context (required) */ @Put(uri="/fake/test-query-parameters") - @Consumes(value={"application/json"}) Mono testQueryParameterCollectionFormat( @QueryValue(value="pipe") @NotNull List pipe, @QueryValue(value="ioutil") @NotNull List ioutil, diff --git a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeClassnameTags123Api.java b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeClassnameTags123Api.java index 8cdc620330e..ec85b9286d3 100644 --- a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeClassnameTags123Api.java +++ b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/FakeClassnameTags123Api.java @@ -38,8 +38,8 @@ public interface FakeClassnameTags123Api { * @return ModelClient */ @Patch(uri="/fake_classname_test") - @Produces(value={"application/json"}) - @Consumes(value={"application/json"}) + @Consumes({"application/json"}) + @Produces({"application/json"}) Mono testClassname( @Body @NotNull @Valid ModelClient _body ); diff --git a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/PetApi.java b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/PetApi.java index ff635c948c3..589f10b7239 100644 --- a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/PetApi.java +++ b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/PetApi.java @@ -39,8 +39,7 @@ public interface PetApi { * @param _body Pet object that needs to be added to the store (required) */ @Post(uri="/pet") - @Produces(value={"application/json"}) - @Consumes(value={"application/json"}) + @Produces({"application/json", "application/xml"}) Mono addPet( @Body @NotNull @Valid Pet _body ); @@ -52,7 +51,6 @@ public interface PetApi { * @param apiKey (optional) */ @Delete(uri="/pet/{petId}") - @Consumes(value={"application/json"}) Mono deletePet( @PathVariable(name="petId") @NotNull Long petId, @Header(name="api_key") @Nullable String apiKey @@ -66,7 +64,7 @@ public interface PetApi { * @return List<Pet> */ @Get(uri="/pet/findByStatus") - @Consumes(value={"application/json"}) + @Consumes({"application/xml", "application/json"}) Mono> findPetsByStatus( @QueryValue(value="status") @NotNull List status ); @@ -79,7 +77,7 @@ public interface PetApi { * @return Set<Pet> */ @Get(uri="/pet/findByTags") - @Consumes(value={"application/json"}) + @Consumes({"application/xml", "application/json"}) Mono> findPetsByTags( @QueryValue(value="tags") @NotNull Set tags ); @@ -92,7 +90,7 @@ public interface PetApi { * @return Pet */ @Get(uri="/pet/{petId}") - @Consumes(value={"application/json"}) + @Consumes({"application/xml", "application/json"}) Mono getPetById( @PathVariable(name="petId") @NotNull Long petId ); @@ -103,8 +101,7 @@ public interface PetApi { * @param _body Pet object that needs to be added to the store (required) */ @Put(uri="/pet") - @Produces(value={"application/json"}) - @Consumes(value={"application/json"}) + @Produces({"application/json", "application/xml"}) Mono updatePet( @Body @NotNull @Valid Pet _body ); @@ -117,8 +114,7 @@ public interface PetApi { * @param status Updated status of the pet (optional) */ @Post(uri="/pet/{petId}") - @Produces(value={"application/x-www-form-urlencoded"}) - @Consumes(value={"application/json"}) + @Produces({"application/x-www-form-urlencoded"}) Mono updatePetWithForm( @PathVariable(name="petId") @NotNull Long petId, @Nullable String name, @@ -134,8 +130,8 @@ public interface PetApi { * @return ModelApiResponse */ @Post(uri="/pet/{petId}/uploadImage") - @Produces(value={"multipart/form-data"}) - @Consumes(value={"application/json"}) + @Consumes({"application/json"}) + @Produces({"multipart/form-data"}) Mono uploadFile( @PathVariable(name="petId") @NotNull Long petId, @Nullable String additionalMetadata, @@ -151,8 +147,8 @@ public interface PetApi { * @return ModelApiResponse */ @Post(uri="/fake/{petId}/uploadImageWithRequiredFile") - @Produces(value={"multipart/form-data"}) - @Consumes(value={"application/json"}) + @Consumes({"application/json"}) + @Produces({"multipart/form-data"}) Mono uploadFileWithRequiredFile( @PathVariable(name="petId") @NotNull Long petId, @NotNull File requiredFile, diff --git a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/StoreApi.java b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/StoreApi.java index 9a3b23b73cb..6ee9bf5bf33 100644 --- a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/StoreApi.java +++ b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/StoreApi.java @@ -37,7 +37,6 @@ public interface StoreApi { * @param orderId ID of the order that needs to be deleted (required) */ @Delete(uri="/store/order/{order_id}") - @Consumes(value={"application/json"}) Mono deleteOrder( @PathVariable(name="order_id") @NotNull String orderId ); @@ -49,7 +48,7 @@ public interface StoreApi { * @return Map<String, Integer> */ @Get(uri="/store/inventory") - @Consumes(value={"application/json"}) + @Consumes({"application/json"}) Mono> getInventory(); /** @@ -60,7 +59,7 @@ public interface StoreApi { * @return Order */ @Get(uri="/store/order/{order_id}") - @Consumes(value={"application/json"}) + @Consumes({"application/xml", "application/json"}) Mono getOrderById( @PathVariable(name="order_id") @NotNull @Min(1L) @Max(5L) Long orderId ); @@ -72,8 +71,7 @@ public interface StoreApi { * @return Order */ @Post(uri="/store/order") - @Produces(value={"*/*"}) - @Consumes(value={"application/json"}) + @Consumes({"application/xml", "application/json"}) Mono placeOrder( @Body @NotNull @Valid Order _body ); diff --git a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/UserApi.java b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/UserApi.java index 316678593b7..e4c1285a981 100644 --- a/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/UserApi.java +++ b/samples/client/petstore/java-micronaut-client/src/main/java/org/openapitools/api/UserApi.java @@ -38,8 +38,6 @@ public interface UserApi { * @param _body Created user object (required) */ @Post(uri="/user") - @Produces(value={"*/*"}) - @Consumes(value={"application/json"}) Mono createUser( @Body @NotNull @Valid User _body ); @@ -50,8 +48,6 @@ public interface UserApi { * @param _body List of user object (required) */ @Post(uri="/user/createWithArray") - @Produces(value={"*/*"}) - @Consumes(value={"application/json"}) Mono createUsersWithArrayInput( @Body @NotNull List _body ); @@ -62,8 +58,6 @@ public interface UserApi { * @param _body List of user object (required) */ @Post(uri="/user/createWithList") - @Produces(value={"*/*"}) - @Consumes(value={"application/json"}) Mono createUsersWithListInput( @Body @NotNull List _body ); @@ -75,7 +69,6 @@ public interface UserApi { * @param username The name that needs to be deleted (required) */ @Delete(uri="/user/{username}") - @Consumes(value={"application/json"}) Mono deleteUser( @PathVariable(name="username") @NotNull String username ); @@ -87,7 +80,7 @@ public interface UserApi { * @return User */ @Get(uri="/user/{username}") - @Consumes(value={"application/json"}) + @Consumes({"application/xml", "application/json"}) Mono getUserByName( @PathVariable(name="username") @NotNull String username ); @@ -100,7 +93,7 @@ public interface UserApi { * @return String */ @Get(uri="/user/login") - @Consumes(value={"application/json"}) + @Consumes({"application/xml", "application/json"}) Mono loginUser( @QueryValue(value="username") @NotNull String username, @QueryValue(value="password") @NotNull String password @@ -111,7 +104,6 @@ public interface UserApi { * */ @Get(uri="/user/logout") - @Consumes(value={"application/json"}) Mono logoutUser(); /** @@ -122,8 +114,6 @@ public interface UserApi { * @param _body Updated user object (required) */ @Put(uri="/user/{username}") - @Produces(value={"*/*"}) - @Consumes(value={"application/json"}) Mono updateUser( @PathVariable(name="username") @NotNull String username, @Body @NotNull @Valid User _body diff --git a/samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/PetApiSpec.groovy b/samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/PetApiSpec.groovy index 9133776726e..36e9a218c37 100644 --- a/samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/PetApiSpec.groovy +++ b/samples/client/petstore/java-micronaut-client/src/test/groovy/org/openapitools/api/PetApiSpec.groovy @@ -8,6 +8,7 @@ import org.openapitools.model.Tag import org.openapitools.model.Pet import io.micronaut.test.extensions.spock.annotation.MicronautTest +import spock.lang.Ignore import spock.lang.Specification import jakarta.inject.Inject @@ -48,7 +49,7 @@ class PetApiSpec extends Specification { then: var e = thrown(HttpClientResponseException.class) - e.getMessage() == "Pet not found" + e.getMessage().contains("Pet not found") e.getStatus() == HttpStatus.NOT_FOUND } @@ -74,6 +75,7 @@ class PetApiSpec extends Specification { * Finds Pets by status * Multiple status values can be provided with comma separated strings */ + @Ignore("Issue reported in https://github.com/micronaut-projects/micronaut-jackson-xml/issues/175") void "findPetsByStatus() test"() { given: Pet pet = new Pet() @@ -230,6 +232,7 @@ class PetApiSpec extends Specification { notThrown() } + @Ignore("Issue reported in https://github.com/micronaut-projects/micronaut-jackson-xml/issues/175") void "findPetByTags() test"() { given: Tag tag = new Tag().name("cute").id(2L)