mulesoft-labs / raml-for-jax-rs

This project is all about two way transformation of JAX-RS-annotated Java code to RAML API description and back.
Other
296 stars 181 forks source link

RAML to Java - Result objects do not compile due missing override of methods #417

Open JuanCBasso opened 4 years ago

JuanCBasso commented 4 years ago

Hi, I'm using raml-to-jaxrs-maven-plugin version 3.0.7 , and the result objects do not compile , the issue I is when having inheritance of types in the RAML definition. When having some types like :

baseEndpointConfig:
    type: object
    displayName: Base Endpoint Config object
    discriminator: configName
    properties:
      configName: string
      serverAddress:
        type: string
        displayName: Server Address
        required: false
        description: Defines Server/Host Address
      serverPort:
        type: integer
        displayName: Server Port
        required: false
      authMode:
        type: AuthModeBaseConfig
        required: false
        default: { 'authType': 'NONE'}
    additionalProperties: true

  BaseEndpoint:
    type: object
    displayName: Base Endpoint
    discriminator: endpointType
    properties:
      id :
        type: string
        required: false
      name: string
      endpointType:
        type: string
        required: false
      config:
        type: baseEndpointConfig
        properties:

  httpConfig:
    type: baseEndpointConfig
    discriminatorValue: http
    properties:
      protocol:
        enum: [ 'HTTP', 'HTTPS' ]
        default: 'HTTP'
      serverAddress: string
      serverPort:
        type: integer
        default: 80
      path: string
      allowedMethods:
        enum: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']
        default: 'POST'
      authMode:
        type: AuthModeBaseConfig

  http:
    type: BaseEndpoint
    displayName: HTTP Endpoint
    discriminatorValue: HTTP
    properties:
      config: httpConfig

  as9Config:
    type: baseEndpointConfig
    discriminatorValue: AS9
    properties:
      protocol:
        enum: [ 'HTTP', 'HTTPS' ]
        default: 'HTTP'
      httpEndpointUrl?:
        type: string

  as9:
    type: BaseEndpoint
    displayName: AS9 Endpoint
    discriminatorValue: AS2
    properties:
      config: as9Config

I got this error in my generated classes:

HttpImpl.java:[8,8] api.model.HttpImpl is not abstract and does not override abstract method setConfig(api.model.BaseEndpointConfig) in api.model.BaseEndpoint

This is an example of the API I'm trying to use with the plugin : api.zip

jstoiko commented 4 years ago

This might have to do with the empty properties node that is set on the BaseEndpoint type's config property, can you try removing that line to see if that fixes the issue?

JuanCBasso commented 4 years ago

Hi!, thanks for the response, I've tried without the properties line in the config property but got the same result.

jpbelang commented 4 years ago

From the top of my head, there is a problem with with overriding properties relative to Java with config

Java supports covariant return types, meaning that subclass overrides of a given method can't return subclasses of the return class of the parent method.

Java does not support covariant or contravariant parameters (where methods of a subclass can't change the parameters to a subclass of the parent method, or to a more general type).

There is a plan, in 4.0 to give an option to remove interfaces (and as a side effect removing multiple inheritance) and allow such constructs.

If you remove the config from the top class BaseEndpoint, then it should work.

jpbelang commented 4 years ago

Another discussion around these subjects: https://github.com/mulesoft-labs/raml-for-jax-rs/issues/402