0

Greetings human beings.

I'm trying to migrate application with a several of other libaries from Java 11, Spring-Boot 2.7.x to Java 17, Spring-Boot 3 We also need to migrate swagger-codegen-maven-plugin to openapi-generator-maven-plugin, because we use .yaml files with Swagger specifications. However, when we run a mvn clean package or mvn clean install, we are facing this issue: [Illegal start of expression ',', ')', or '' expected

Illegal start of expression ',', ')', or '[' expected

We know that swagger-codegen-maven-plugin use the mustache file via <templateDirectory> tag, but openapi-generator-maven-plugin supports it either? With the same tag? We notice yet that the comma are missing when the classes are generated, after the migration.

All swagger .yamls where converted from version 2.0 to version 3.0.1 via https://editor-next.swagger.io/

This is my pom.xml execution for the specified swagger file:

<execution>
    <id>crosscore</id>
    <goals>
        <goal>generate</goal>
    </goals>
    <configuration>
        <inputSpec>src/main/resources/feign/swagger/crosscore.yaml</inputSpec>
        <templateDirectory>src/main/resources/feign/templates</templateDirectory>
        <generatorName>spring</generatorName>
        <library>spring-cloud</library>
        <modelPackage>br.com.experian.api.crosscore.model</modelPackage>
        <apiPackage>br.com.experian.api.crosscore.api</apiPackage>
        <generateSupportingFiles>false</generateSupportingFiles>
        <configOptions>
            <sourceFolder>gen</sourceFolder>
            <useJakartaEe>true</useJakartaEe>
            <useSpringBoot3>true</useSpringBoot3>
            <java7>true</java7>
            <dateLibrary>joda</dateLibrary>
            <title>crosscore</title> <!-- Used for feign bean name and uri property-->
        </configOptions>
    </configuration>
</execution>

This is my execution configurations:

<execution>
    <id>crosscore</id>
    <goals>
        <goal>generate</goal>
    </goals>
    <configuration>
        <inputSpec>src/main/resources/feign/swagger/crosscore.yaml</inputSpec>
        <templateDirectory>src/main/resources/feign/templates</templateDirectory>
        <generatorName>spring</generatorName>
        <library>spring-cloud</library>
        <modelPackage>br.com.experian.api.crosscore.model</modelPackage>
        <apiPackage>br.com.experian.api.crosscore.api</apiPackage>
        <generateSupportingFiles>false</generateSupportingFiles>
        <configOptions>
            <sourceFolder>gen</sourceFolder>
            <useJakartaEe>true</useJakartaEe>
            <useSpringBoot3>true</useSpringBoot3>
            <java7>true</java7>
            <dateLibrary>joda</dateLibrary>
            <title>crosscore</title> <!-- Used for feign bean name and uri property-->
        </configOptions>
    </configuration>
</execution>
OpenAPI yaml declaration file partial content
//more code ommited
paths:
  /DefaultRequestListener:
    post:
      tags:
        - CrossCore
      summary: CrossCore API Submit Request
      description: This API requires SSL, using the Security Certificate provided
        by Experian, and SHA-256 HMAC-signature using the HMAC key provided by Experian.
        Also, please inform the IP addresses to be allowed to connect to CrossCore.
      operationId: submit
      parameters:
        - name: workflow
          in: query
          description: ?RedBoxCPF
          schema:
            type: string
      requestBody:
        description: CrossCore Request
        content:
          application/json; charset=utf-8:
            schema:
              $ref: '#/components/schemas/RequestMessage'
        required: true
      responses:
        200:
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseMessage'
      x-codegen-request-body-name: body
components:
  schemas:
    RequestMessage:
      required:
        - header
        - payload
      type: object
      properties:
        header:
          $ref: '#/components/schemas/RequestHeader'
        payload:
          $ref: '#/components/schemas/RequestPayload'
    RequestHeader:
      type: object
      properties:
        tenantId:
          maxLength: 8
          type: string
          description: Client Identifier as provided by Experian  Delivery Team.
          example: ABCD1234
        clientReferenceId:
          maxLength: 90
          type: string
          description: Unique client reference for each submission. This is provided
            by the client.
          example: YourRequestUniqueID
        messageTime:
          type: string
          description: Time message is submitted to the API, in UTC-0. The Time Zone
            Designator (TZD) value must be Z
          format: date-time
          example: 2019-10-23T14:20:04Z
        requestType:
          maxLength: 40
          type: string
          description: Used to determine the workflow and strategy manager as provided
            by Experian Delivery Team.
          example: KQO
        options:
          $ref: '#/components/schemas/Options'
        expRequestId:
          maxLength: 90
          type: string
          description: Experian generated unique Id
          example: RB000043766204
      description: Section for all control parameters for the submit API.
    Options:
      type: object
    RequestPayload:
      required:
        - application
        - contacts
      type: object
      properties:
        contacts:
          type: array
          description: The contacts object contains all contact information [Email(s)]
            for any email associated to an event. You can include any number of contacts'
            information in the message.
          items:
            $ref: '#/components/schemas/Contact'
        application:
          $ref: '#/components/schemas/Application'
        device:
          $ref: '#/components/schemas/Device'
    Contact:
      required:
        - emails
        - id
        - names
        - person
      type: object
      properties:
        id:
          maxLength: 40
          type: string
          description: Value used to cross-reference pieces of data to other objects
            within the message. When you need to reference this object, you will use
            this id value in the target object to associate this object to the target
            object
          example: MAINCONTACT_1
        person:
          $ref: '#/components/schemas/Person'
        names:
          $ref: '#/components/schemas/Names'
        emails:
          type: array
          items:
            $ref: '#/components/schemas/ContactEmail'
      description: The contacts object contains all contact information [Person(s),
        identityDocuments, organizations, addresses, telephones, etc.] for any person
        associated to an event. You can include any number of contacts' information
        in the message
    Person:
      required:
        - personIdentifier
        - typeOfPerson
      type: object
      properties:
        typeOfPerson:
          maxLength: 20
          type: string
          description: Indicator for the person type. Enum field values must be all
            CAPS. Please check the "Enum List" tab for a listing of all enumerations
          example: APPLICANT
          enum:
            - APPLICANT
        personIdentifier:
          maxLength: 20
          type: string
          description: Unique client identifier for the person. --Usar CPF do proponente--
          example: "12345678901"
      description: Single person defined for the submit request
    Names:
      type: object
      properties:
        id:
          type: string
          description: '...'
          example: MAINPERSONNAME_1
        firstName:
          type: string
          description: '...'
          example: JUSTINO
    ContactEmail:
      type: object
      properties:
        id:
          type: string
          description: '...'
          example: EMAIL_1
        email:
          type: string
          description: '...'
          format: email
          example: admin@nowhere.net
    Application:
      required:
        - applicants
      type: object
      properties:
        applicationId:
          maxLength: 26
          type: string
          description: ""
          example: APPLICATION_1
        applicants:
          type: array
          items:
            $ref: '#/components/schemas/Applicant'
    Applicant:
      type: object
      properties:
        id:
          maxLength: 40
          type: string
          description: ""
          example: MAINAPPLICANT_1
        applicantType:
          maxLength: 26
          type: string
          description: ""
          example: APPLICANT
          enum:
            - APPLICANT
        contactId:
          maxLength: 40
          type: string
          description: ""
          example: MAINCONTACT_1
        type:
          maxLength: 40
          type: string
          description: ""
          example: INDIVIDUAL
    Device:
      type: object
      properties:
        id:
          maxLength: 40
          type: string
          description: '...'
          example: DEVICEID_1
        ipAddress:
          maxLength: 40
          type: string
          description: '...'
          example: 10.0.0.1
    ResponseMessage:
      required:
        - clientResponsePayload
        - responseHeader
      type: object
      properties:
        responseHeader:
          $ref: '#/components/schemas/ResponseHeader'
        clientResponsePayload:
          $ref: '#/components/schemas/ClientResponsePayload'
        originalRequestData:
          $ref: '#/components/schemas/RequestPayload'
      description: Error, Warning, or Informational message describing the response.
      //more code ommited

This is my Mustache file:

package {{package}};

{{#imports}}import {{import}};
{{/imports}}
{{#jdk8-no-delegate}}
import com.fasterxml.jackson.databind.ObjectMapper;
{{/jdk8-no-delegate}}
import io.swagger.annotations.*;
{{#jdk8-no-delegate}}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
{{/jdk8-no-delegate}}
import org.springframework.http.ResponseEntity;
{{#useBeanValidation}}
import org.springframework.validation.annotation.Validated;
{{/useBeanValidation}}
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

{{#jdk8-no-delegate}}
import javax.servlet.http.HttpServletRequest;
{{/jdk8-no-delegate}}
{{#useBeanValidation}}
import javax.validation.Valid;
import javax.validation.constraints.*;
{{/useBeanValidation}}
{{#jdk8-no-delegate}}
import java.io.IOException;
{{/jdk8-no-delegate}}
import java.util.List;
{{#jdk8-no-delegate}}
import java.util.Optional;
{{/jdk8-no-delegate}}
{{^jdk8-no-delegate}}
    {{#useOptional}}
import java.util.Optional;
    {{/useOptional}}
{{/jdk8-no-delegate}}
{{#async}}
import java.util.concurrent.{{^jdk8}}Callable{{/jdk8}}{{#jdk8}}CompletableFuture{{/jdk8}};
{{/async}}

import io.swagger.annotations.*;
import org.springframework.cloud.openfeign.FeignClient;
import br.com.experian.configuration.feign.config.FeignClientConfig;

{{=<% %>=}}
@FeignClient(name="<%title%>", url="${api.<%title%>.uri}", configuration = FeignClientConfig.class)
<%={{ }}=%>
{{#operations}}
public interface {{classname}}Client {

{{#operation}}
    @RequestMapping(value = "{{{path}}}",{{#singleContentTypes}}{{#hasProduces}}
        produces = "{{{vendorExtensions.x-accepts}}};charset=UTF-8", {{/hasProduces}}{{#hasConsumes}}
        consumes = "{{{vendorExtensions.x-contentType}}};charset=UTF-8",{{/hasConsumes}}{{/singleContentTypes}}{{^singleContentTypes}}{{#hasProduces}}
        produces = { {{#produces}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }, {{/hasProduces}}{{#hasConsumes}}
        consumes = { {{#consumes}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} },{{/hasConsumes}}{{/singleContentTypes}}
        method = RequestMethod.{{httpMethod}})
    {{>returnTypes}} {{operationId}}(@RequestHeader(value = "hmac-signature") String authorization, {{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/allParams}});

{{/operation}}
}
{{/operations}}

This is my class generated via mvn clean package:

CrossCoreApiCliente

I don't know exactly why the guy who wrote this tried to do using mustache and swagger. Someone can help us? Thank you!

I'm expecting to understand if open-api-generator use the same tag for templates, and why we are facing a Illegal start of expression. Why is there a missing comma? Is this a bug of open-api-generator when using mustache templates?

0 Answers0