Сервисы, сгенерированные openapi-generator-cli, не вводятся

Я пытаюсь создать клиент API из файла swagger v2 с помощью openapi-generator-cli. Для этого я использую докер-контейнер openapi-generator-cli, который сообщает о своей версии как «4.1.0-SNAPSHOT».

Генерация кода работает со следующими параметрами:

{
    "npmName": "...",
    "npmVersion": "0.0.3",
    "snapshot": true,
    "ngVersion": "8.1.1"
}

и я также попытался установить для параметра providedInRoot значение true.

Однако сгенерированные классы обслуживания не аннотируются декоратором @Injectable. Поэтому, импортировав их в свой компонент и добавив службу в конструктор компонента, я не могу их использовать. Вот так выглядит мой компонент:

import { Component, OnInit } from '@angular/core';

import { UsersService, User } from '...'

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  constructor(userService: UsersService) {}

  title = 'user-frontend';

  ngOnInit() {
    this.userService.listUsers();
  }

}

что не удается, потому что userService не существует в области AppComponent.

Вот как я импортирую сгенерированный модуль:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';

import { ApiModule } from '...';
import { HttpClientModule } from '@angular/common/http';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    ApiModule,
    HttpClientModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Любые идеи о том, где моя ошибка при создании клиента api?

РЕДАКТИРОВАТЬ: Сгенерированный код выглядит следующим образом:

@Injectable({
  providedIn: 'root'
})
export class UsersService {

    protected basePath = 'http://localhost';
    public defaultHeaders = new HttpHeaders();
    public configuration = new Configuration();
    public encoder: HttpParameterCodec;

    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {

        if (configuration) {
            this.configuration = configuration;
            this.configuration.basePath = configuration.basePath || basePath || this.basePath;

        } else {
            this.configuration.basePath = basePath || this.basePath;
        }
        this.encoder = this.configuration.encoder || new CustomHttpParameterCodec();
    }

...
}

person der_berni    schedule 30.07.2019    source источник
comment
Вы пробовали поместить ApiModule в массив провайдеров?   -  person Augustin R    schedule 30.07.2019
comment
@AugustinR, я только что пробовал, но не помогло   -  person der_berni    schedule 30.07.2019


Ответы (1)


Многие вопросы import {ApiModule} из '...'; откуда генерируется код? Вы публикуете его в npm и используете или просто копируете и вставляете сгенерированный код? Попробуй это

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    ApiModule.forRoot(() => {
      return new Configuration({
        basePath: `${environment.HOST}:${environment.PORT}`,
      });
    }),,
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Ваш сгенерированный код должен понравиться

@Injectable({
  providedIn: 'root'
})
export class PetsService {

    protected basePath = 'http://localhost';
    public defaultHeaders = new HttpHeaders();
    public configuration = new Configuration();

    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {

        if (configuration) {
            this.configuration = configuration;
            this.configuration.basePath = configuration.basePath || basePath || this.basePath;

        } else {
            this.configuration.basePath = basePath || this.basePath;
        }
    }

Решение: используйте в конструкторе private или public

Объяснение: Здесь у нас то же самое, что и у вашей проблемы, машинописный текст не знаю, что вы хотите

class TestClass {
  constructor(name: string) {
  }
}

Здесь у нас есть последний пример на обычном языке программирования POO.

class TestClass {
  private name: string;

  constructor(name: string) {
    this.name = name;
  }
}

Но машинописный текст дает нам простой способ минимизировать код.

class TestClass {
  constructor(private name: string) { }
}
person anthony willis muñoz    schedule 30.07.2019
comment
Спасибо за подсказку, к сожалению, я все еще получаю ту же ошибку. Чтобы ответить на ваш вопрос, я публикую сгенерированный код в частном npm и использую его оттуда. Поскольку я могу импортировать ApiModule, классы и т. Д., Я вполне уверен, что эта часть работает. Не могли бы вы намекнуть, почему разные способы включения ApiModule в мой проект могут привести к такой ошибке? - person der_berni; 30.07.2019
comment
Вы генерируете код и конвертируете его в угловую библиотеку с помощью ng-packagr? - person anthony willis muñoz; 30.07.2019
comment
Точно, я генерирую код, переключаюсь в папку с сгенерированным кодом, затем запускаю: npm install, next npm run build (который выполняет ng-packagr), затем вхожу в свой реестр npm и делаю npm publish dist в свой реестр. - person der_berni; 30.07.2019
comment
У меня то же самое, похоже, проблема с шаблоном, проверьте мои изменения выше и скажите мне, если вы сгенерируете код, это что-то вроде этого - person anthony willis muñoz; 30.07.2019
comment
Спасибо за вашу помощь, я отредактировал свой вопрос и добавил экспортированный класс UsersService. По мне то же самое. - person der_berni; 30.07.2019
comment
странно, после работы я тебе еще помогу. Есть какая-то ошибка или просто сервис не распознается? - person anthony willis muñoz; 30.07.2019
comment
С помощью приведенного выше кода я получаю следующую ошибку при создании проекта angular: Свойство userService не существует для типа AppComponent. - person der_berni; 30.07.2019
comment
попробуйте private userService: UsersService - person anthony willis muñoz; 30.07.2019
comment
Спасибо, я тоже это попробовал, и теперь это работает ... У вас есть объяснение, почему необходимо ключевое слово private / public? Например, нет ли по умолчанию приватности? - person der_berni; 30.07.2019
comment
объяснение выше :) - person anthony willis muñoz; 30.07.2019