[Swagger-Codegen] Error - Unrecognized token 'swagger' while parsing

740 views
Skip to first unread message

hervé DARRITCHON

unread,
Sep 8, 2015, 11:35:15 AM9/8/15
to Swagger
Hi,

using Maven plugin and maven-codegen I have an issue during parsing on linux but it works on mac os :).

below the error, the pom.xml conf and the swagger spec.

Do you have an idea ?

the error is :
reading from src/main/swagger/api-admin-data.yml
[WARNING] no property from null, null, {ENUM=null, TITLE=null, DESCRIPTION=null, DEFAULT=null, PATTERN=null, DESCRIMINATOR=null, MIN_ITEMS=null, MAX_ITEMS=null, MIN_PROPERTIES=null, MAX_PROPERTIES=null, MIN_LENGTH=null, MAX_LENGTH=null, MINIMUM=null, MAXIMUM=null, EXCLUSIVE_MINIMUM=null, EXCLUSIVE_MAXIMUM=null, UNIQUE_ITEMS=null, EXAMPLE=null, TYPE=null, FORMAT=null, READ_ONLY=null, VENDOR_EXTENSIONS={}}
(was java.lang.NullPointerException) (through reference chain: io.swagger.models.Response["schema"]) (through reference chain: io.swagger.models.Path["get"]->io.swagger.models.Operation["responses"]->java.util.LinkedHashMap["400"]) (through reference chain: io.swagger.models.Swagger["paths"]->java.util.LinkedHashMap["/users"])
reading from src/main/swagger/api-admin-data.yml
[WARNING] no property from null, null, {ENUM=null, TITLE=null, DESCRIPTION=null, DEFAULT=null, PATTERN=null, DESCRIMINATOR=null, MIN_ITEMS=null, MAX_ITEMS=null, MIN_PROPERTIES=null, MAX_PROPERTIES=null, MIN_LENGTH=null, MAX_LENGTH=null, MINIMUM=null, MAXIMUM=null, EXCLUSIVE_MINIMUM=null, EXCLUSIVE_MAXIMUM=null, UNIQUE_ITEMS=null, EXAMPLE=null, TYPE=null, FORMAT=null, READ_ONLY=null, VENDOR_EXTENSIONS={}}
(was java.lang.NullPointerException) (through reference chain: io.swagger.models.Response["schema"]) (through reference chain: io.swagger.models.Path["get"]->io.swagger.models.Operation["responses"]->java.util.LinkedHashMap["400"]) (through reference chain: io.swagger.models.Swagger["paths"]->java.util.LinkedHashMap["/users"])
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'swagger': was expecting ('true', 'false' or 'null')
 at [Source: src/main/swagger/api-admin-data.yml; line: 1, column: 9]
	at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1419)
	at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:508)
	at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3201)
	at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2360)
	at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:794)
	at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:690)
	at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3105)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3051)
	at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:1861)
	at io.swagger.parser.SwaggerCompatConverter.readResourceListing(SwaggerCompatConverter.java:147)
	at io.swagger.parser.SwaggerCompatConverter.read(SwaggerCompatConverter.java:82)
	at io.swagger.parser.SwaggerParser.read(SwaggerParser.java:36)
	at io.swagger.parser.SwaggerParser.read(SwaggerParser.java:15)
	at io.swagger.codegen.plugin.CodeGenMojo.execute(CodeGenMojo.java:122)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
	at org.jvnet.hudson.maven3.launcher.Maven32Launcher.main(Maven32Launcher.java:132)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:330)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:238)
	at jenkins.maven3.agent.Maven32Main.launch(Maven32Main.java:181)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at hudson.maven.Maven3Builder.call(Maven3Builder.java:136)
	at hudson.maven.Maven3Builder.call(Maven3Builder.java:71)
	at hudson.remoting.UserRequest.perform(UserRequest.java:121)
	at hudson.remoting.UserRequest.perform(UserRequest.java:49)
	at hudson.remoting.Request$2.run(Request.java:324)
	at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
-----------------------------------------------------
the pom.xml plugin config is :

<plugin>

<groupId>io.swagger</groupId>

<artifactId>swagger-codegen-maven-plugin</artifactId>

<version>2.1.3</version>

<executions>

<execution>

<goals>

<goal>generate</goal>

</goals>

<configuration>

<inputSpec>src/main/swagger/api-admin-data.yml</inputSpec>

<language>spring-mvc</language>

<output>${project.build.directory}/generated-sources/swagger</output>

<templateDirectory>${project.basedir}/src/main/swagger/template/JavaSpringMVC</templateDirectory>

<modelPackage>com.orange.dsifapi.microservices.admindata.api.domain</modelPackage>

<apiPackage>com.orange.dsifapi.microservices.admindata.api</apiPackage>

<invokerPackage>com.orange.dsifapi.microservices.admindata.api.invoker</invokerPackage>

<configOptions>

<sourceFolder>src/main/java</sourceFolder>

<groupId>${project.groupId}</groupId>

<artifactId>${project.artifactId}</artifactId>

<artifactVersion>${project.version}</artifactVersion>

</configOptions>

</configuration>

</execution>

</executions>

</plugin>

-----------------------------------------------------

my swagger spec in yaml is (sorry for the french ;) ):

swagger: '2.0'

info:

  description: "API d'administration des données d'habilitation autour de l'utilisateur. Ces données vont servir aux différents moteurs de calculs d'habilitation pour calculer les habilitations de chaque utilisateur."

  version: '0.1'

  title: "API Admin d'Habilitation"

host: a_definir_plus_tard.fr

basePath: /apimocks/api/v1

schemes:

  - http

consumes:

  - application/json

produces:

  - application/json

paths:

  /users:

    get:

      tags:

        - Users

      operationId: searchForUsers

      summary: >

        - Permet de rechercher des utilisateurs en fonction de nom de famille, entité ou bien profil métier.

      description: >

        - Permet de faire des recherches dans la base client afin de trouver des utilisateurs en fonction d'un certains nombres de paramètres. Dans certains cas, on ne connait pas vraiment l'utilisateur à modifier donc il faut le trouver. Pour cela, on peut le trouver par code métier, entité ou bien nom. Au moins 1 des paramètres est obligatoire.

      deprecated: false

      parameters:

        - name: name

          description: "le nom de l'utilisateur que l'on cherche"

          in: query

          required: false

          type: string

        - name: profile

          description: "l'ide du profil métier de l'utilisateur recherché"

          in: query

          required: false

          type: string

        - name: entity

          description: "l'id de l'entité de l'utilisateur recherché"

          in: query

          required: false

          type: string

        - name: offset

          description: "à partir de quel élément on commence à retourner la valeur (pagination avec limit)."

          in: query

          required: false

          type: integer

          format: int32

        - name: limit

          description: "nombre d'élément retourné par l'appel à l'API (entre 1 et 10.)"

          in: query

          required: false

          type: integer

          format: int32

      responses:

        '200':

          description: Liste des utilisateurs trouvés

          schema:

            type: array

            items:

              $ref: '#/definitions/User'

        '400':

          description: la requête est mal construite

          schema:

            items:

              $ref: '#/definitions/Error'

        '500':

          description: "Une erreur s'est produite durant le traitement du serveur"

          schema:

            items:

              $ref: '#/definitions/Error'

    post:

      tags:

        - Users

      operationId: createUser

      summary: >

        - Permet de créer un utilisateur.

      description: >

        - Permet de créer un utilisateur à partir de son id. Actuellement, c'est le seul moyen de créer un utilisateur via l'API donc il faut itérer sur ce verbe pour faire des création en masse.

      deprecated: false

      parameters:

        - name: user

          description: "l'utilisateur que l'on veut créer"

          in: body

          required: true

          schema:

              $ref: '#/definitions/User'

      responses:

        '201':

          description: L'utilisateur est créé. Son url d'accès se situe dans le header dans l'attribut Location.

        '400':

          description: la requête est mal construite

          schema:

            items:

              $ref: '#/definitions/Error'

        '500':

          description: "Une erreur s'est produite durant le traitement du serveur"

          schema:

            items:

              $ref: '#/definitions/Error'

  /users/{cuid}:

    get:

      tags:

        - Users

      operationId: retreiveUserById

      summary: >

        - Permet de récupérer un utilisateur à partir de son CUID qui est sa clé.

      description: >

        - Permet de récupérer un utilisateur en connaissant son CUID. Ainsi il est possible de récupérer un et un seul utilisateur car le CUID est la clé.

      deprecated: false

      parameters:

        - name: cuid

          description: "le cuid de l'utilisateur que l'on veut récupérer"

          in: path

          required: true

          type: string

      responses:

        '200':

          description: Liste des utilisateurs trouvés

          schema:

              $ref: '#/definitions/User'

        '400':

          description: la requête est mal construite

          schema:

            items:

              $ref: '#/definitions/Error'

        '404':

          description: l'utilisateur n'existe pas

          schema:

            items:

              $ref: '#/definitions/Error'

        '500':

          description: "Une erreur s'est produite durant le traitement du serveur"

          schema:

            items:

              $ref: '#/definitions/Error'

    put:

      tags:

        - Users

      operationId: updateUser

      summary: >

        - Permet de maitre à jour un utilisateur à partir de son CUID qui est sa clé.

      description: >

        - Permet de modifier un utilisateur en connaissant son CUID. On modifie complétement la ressource. Pour faire une mise à jour partielle qu'un certains nombres d'éléments, il faut passer par un PATCH.

      deprecated: false

      parameters:

        - name: cuid

          description: "le cuid de l'utilisateur que l'on veut récupérer"

          in: path

          required: true

          type: string

        - name: user

          description: "l'utilisateur que l'on veut récupérer"

          in: body

          required: true

          schema:

              $ref: '#/definitions/User'

      responses:

        '200':

          description: Liste des utilisateurs trouvés

          schema:

              $ref: '#/definitions/User'

        '400':

          description: la requête est mal construite

          schema:

            items:

              $ref: '#/definitions/Error'

        '404':

          description: l'utilisateur n'existe pas

          schema:

            items:

              $ref: '#/definitions/Error'

        '500':

          description: "Une erreur s'est produite durant le traitement du serveur"

          schema:

            items:

              $ref: '#/definitions/Error'

    delete:

      tags:

        - Users

      operationId: deleteUser

      summary: >

        - Permet de créer un utilisateur.

      description: >

        - Permet de créer un utilisateur dans la base de données avec les différents qui sont obligatoires. Une fois l'utilisateur créé, on peut récupérer dans la réponse au niveau du header Location l'url de la nouvelle ressource qui vient d'être créée.

      deprecated: false

      parameters:

        - name: cuid

          description: "le cuid de l'utilisateur (code alliance)"

          in: path

          required: true

          type: string

      responses:

        '204':

          description: L'utilisateur est effacé. Rien n'est retourné dans la réponse.

        '400':

          description: la requête est mal construite

          schema:

            items:

              $ref: '#/definitions/Error'

        '500':

          description: "Une erreur s'est produite durant le traitement du serveur"

          schema:

            items:

              $ref: '#/definitions/Error'

  /profiles:

    get:

      tags:

        - Profiles

      operationId: searchForProfiles

      summary: >

        - Permet de rechercher des profils métier en fonction du nom du profil.

      description: >

        - Permet de faire des recherches dans la base des profils afin de trouver des profils métier en fonction d'un certains nombres de paramètres. Dans certains cas, on ne connait pas vraiment le profil à modifier donc il faut le trouver. Pour cela, on peut le trouver par le nom du profil. Au moins 1 des paramètres est obligatoire.

      deprecated: false

      parameters:

        - name: name

          description: "le nom du profil que l'on cherche"

          in: query

          required: false

          type: string

        - name: offset

          description: "à partir de quel élément on commence à retourner la valeur (pagination avec limit)."

          in: query

          required: false

          type: integer

          format: int32

        - name: limit

          description: "nombre d'élément retourné par l'appel à l'API (entre 1 et 10.)"

          in: query

          required: false

          type: integer

          format: int32

      responses:

        '200':

          description: Liste des entités trouvées

          schema:

            type: array

            items:

              $ref: '#/definitions/Profile'

        '400':

          description: la requête est mal construite

          schema:

            items:

              $ref: '#/definitions/Error'

        '500':

          description: "Une erreur s'est produite durant le traitement du serveur"

          schema:

            items:

              $ref: '#/definitions/Error'

  /entities:

    get:

      tags:

        - Entities

      operationId: searchForEntities

      summary: >

        - Permet de rechercher des entités d'organisation en fonction du nom de l'entité.

      description: >

        - Permet de faire des recherches dans la base des entités afin de trouver des entités en fonction d'un certains nombres de paramètres. Dans certains cas, on ne connait pas vraiment l'entité à modifier donc il faut la trouver. Pour cela, on peut le trouver par le nom de l'entité. Au moins 1 des paramètres est obligatoire.

      deprecated: false

      parameters:

        - name: name

          description: "le nom de l'entité que l'on cherche"

          in: query

          required: false

          type: string

        - name: offset

          description: "à partir de quel élément on commence à retourner la valeur (pagination avec limit)."

          in: query

          required: false

          type: integer

          format: int32

        - name: limit

          description: "nombre d'élément retourné par l'appel à l'API (entre 1 et 10.)"

          in: query

          required: false

          type: integer

          format: int32

      responses:

        '200':

          description: Liste des entités trouvées

          schema:

            type: array

            items:

              $ref: '#/definitions/Entity'

        '400':

          description: la requête est mal construite

          schema:

            items:

              $ref: '#/definitions/Error'

        '500':

          description: "Une erreur s'est produite durant le traitement du serveur"

          schema:

            items:

              $ref: '#/definitions/Error'

definitions:

  User:

    required:

      - login

      - firstname

      - lastname

      - activationDate

    type: object

    properties:

      login:

        description: login de l'utilisateur

        type: string

      firstname:

        description: prénom de l'utilisateur

        type: string

      lastname:

        description: nom de l'utilisateur

        type: string

      email:

        description: email de l'utilisateur

        type: string

      activationDate:

        description: date d'activation de l'utilisateur

        type: string

        format: date

      inactivationDate:

        description: email de l'utilisateur

        type: string

        format: date

      lastModified: 

        description: dernière modification de l'utilisateur

        type: string

        format: date

      businessProfileId:

        description: le code du profil métier de l'utilisateur

        type: string

      entityOrganisationId:

        description: le code de l'entitté d'organisation de l'utilisateur

        type: string

  Profile:

    required:

      - id

      - name

    type: object

    properties:

      id:

        description: le code du profil métier

        type: string

      name:

        description: le nom du proil métier

        type: string

  Entity:

    required:

      - id

      - name

    type: object

    properties:

      id:

        description: le code de l'entité d'organisation

        type: string

      name:

        description: le nom de l'entité d'organisation

        type: string

  Error:

    required:

      - code

      - message

      - description

    type: object

    properties:

      code:

        description: "code d'erreur applicatif"

        type: string

      message:

        description: "message court expliquant l'erreur"

        type: string

      description:

        description: "description longue expliquant l'erreur"

        type: string

      infoURL:

        description: url vers de la documentation ou un formulaire de soutien

        type: string

wing328

unread,
Sep 9, 2015, 12:08:37 AM9/9/15
to Swagger
I would suggest you to compare the Maven and JVM version to see if there's any difference as I can't think of any reason why it would work in Mac but not Linux.

Also instead of using api-admin-data.yml, try the swagger petstore example (modules/swagger-codegen/src/test/resources/2_0/petstore.json) to see if the error goes away.

William

hervé DARRITCHON於 2015年9月8日星期二 UTC+8下午11時35分15秒寫道:

hervé DARRITCHON

unread,
Sep 9, 2015, 11:55:32 AM9/9/15
to Swagger
Hi, 

I have done some tests (deleting lines after lines) and I found the problems.

In my swagger spec I had :

        '400':
          description: la requ te est mal construite
          schema:
            item:
              $ref: '#/definitions/Error'

and if I delete the item line it works.
       '400':
          description: la requ te est mal construite
          schema:
              $ref: '#/definitions/Error'

The problem is that the former version is valid in Swagger Editor but it fails on linux in Swagger Codegen.

Do I have to raise an issue in Swagger Codegen or un Swagger Editor ?

What do you think ?

Ron Ratovsky

unread,
Sep 9, 2015, 12:15:47 PM9/9/15
to Swagger
Herve, if the editor doesn't yell on your original spec, then it has a bug. The original spec you shared is not valid.
Since I'm not sure what you intended to do with the 'item' (whether it's an array or a named property?), it's difficult to suggest the proper representation.

--
You received this message because you are subscribed to the Google Groups "Swagger" group.
To unsubscribe from this group and stop receiving emails from it, send an email to swagger-swaggers...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
-----------------------------------------
http://swagger.io
https://twitter.com/SwaggerApi
-----------------------------------------
Reply all
Reply to author
Forward
0 new messages