Skip to content
This repository has been archived by the owner on Feb 12, 2022. It is now read-only.

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

Open
JuanCBasso opened this issue Dec 19, 2019 · 4 comments

Comments

@JuanCBasso
Copy link

JuanCBasso commented Dec 19, 2019

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
Copy link
Contributor

jstoiko commented Dec 19, 2019

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
Copy link
Author

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

@jpbelang
Copy link
Contributor

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
Copy link
Contributor

Another discussion around these subjects:
#402

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants