Пружинный контроллер JHipster с микросервисами - PullRequest
1 голос
/ 08 апреля 2020

У меня есть приложение JHipster gateway + microservice. Я добавил весенний сервис с jhipster spring-controller, а затем отредактировал код следующим образом:

@RestController
@RequestMapping("/api/data")
public class DataResource {

    /**
    * GET vin
    */
    @GetMapping("/vin")
    public ResponseEntity<Object> vin(@Valid @RequestBody String address) {
        Chart3DataDTO[] data=new Chart3DataDTO[15];
        for (int i=0;i<15;i++){
            data[i]=new Chart3DataDTO(System.currentTimeMillis()+i, 200+i, 201+i, 202+i);
        }
        return ResponseEntity.ok(data);
    }

Для полноты, это DTO

public class Chart3DataDTO {

    private Long xAxis;
    private Integer[] yAxis=new Integer[3];

    public Chart3DataDTO(Long xAxis, Integer yAxis1, Integer yAxis2, Integer yAxis3) {
        this.xAxis = xAxis;
        this.yAxis = new Integer[]{yAxis1, yAxis2, yAxis3};
    }

    public Long getxAxis() {
        return xAxis;
    }

    public Integer[] getyAxis() {
        return yAxis;
    }
}

Затем у меня есть докеризованный шлюз и микросервис jhipster docker-compose и все началось. Все работает, но когда Angular frontent запрашивает /api/data/vin, я получаю:

  • , если не авторизован: 401 (что нормально)

  • если залогинен: на странице JHipster «произошла ошибка» вместо возврата JSON DTO

Что я пропустил?

Также , он не указан в реестре API Jhipster

2-Й РЕДАКТИРОВАТЬ: Добавлен клиент angular код

import { Injectable } from '@angular/core';
import { Observable, of, throwError } from 'rxjs';
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { catchError, tap, map } from 'rxjs/operators';

const httpOptions = {
  headers: new HttpHeaders({ 'Content-Type': 'application/json',
    'Access-Control-Allow-Origin':'*'

  })
};
//const apiUrl = 'api/vin';
const apiUrl = '/api/data/vin';

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

  constructor(private http: HttpClient) {}
  /*
  private handleError<T> (operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {

      // TODO: send the error to remote logging infrastructure
      console.error(error); // log to console instead

      // Let the app keep running by returning an empty result.
      return of(result as T);
    };
  }
*/
  getInputVoltage(address: String): Observable<[]> {
    return this.http.get<[]>(`${apiUrl}` + '?address=' + address,httpOptions);
  }
}

И

import { Component, OnInit } from '@angular/core';
import * as Highcharts from 'highcharts';
import { ApiService } from '../api.service';

@Component({
  selector: 'jhi-device-graph',
  templateUrl: './device-graph.component.html',
  styleUrls: ['./device-graph.component.scss']
})
export class DeviceGraphComponent implements OnInit {
  Highcharts: typeof Highcharts = Highcharts;
  chartOptions: Highcharts.Options = {
    xAxis: {
      type: 'datetime'
    },
    yAxis: {
      title: {
        text: 'Voltage'
      }
    },
    title: {
      text: 'Input voltage'
    },
    series: [
      {
        data: [
          [Date.UTC(2010, 0, 1), 29.9],
          [Date.UTC(2010, 2, 1), 71.5],
          [Date.UTC(2010, 3, 1), 106.4]
        ],
        type: 'line',
        name: 'Vin1'
      },
      {
        data: [
          [Date.UTC(2010, 0, 1), 39.9],
          [Date.UTC(2010, 2, 1), 91.5],
          [Date.UTC(2010, 3, 1), 96.4]
        ],
        type: 'line',
        name: 'Vin2'
      }
    ]
  };

  data: String[] = [];
  isLoadingResults = true;

  constructor(private api: ApiService) {}

  ngOnInit(): void {
    this.api.getInputVoltage('10.1.30.1').subscribe(
      (res: any) => {
        this.data = res;
        //console.log(this.data);
        this.isLoadingResults = false;
      },
      err => {
        //console.log(err);
        this.isLoadingResults = false;
      }
    );
  }
}

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Ваш angular клиент отправляет запрос GET на / api / data / vin с параметрами запроса, в то время как ваш REST-контроллер ожидает тело запроса, это не может работать.

Ваш контроллер должен ожидать @RequestParam

Кроме того, поскольку запрос проходит через шлюз, перед ним должен стоять префикс /services и имя вашей службы, поэтому в вашем случае URL-адрес /services/graph/api/data/vin.

Также используется @Valid в строке ничего не делает, если вы не добавите другие аннотации проверки, такие как @NotBlank или @Size(max=30)

@GetMapping("/vin")
public ResponseEntity<Object> vin(@Valid @RequestParam String address) {

@RequestBody должны использоваться только для POST или PUT.

1 голос
/ 08 апреля 2020

Предполагая, что вы отправляете параметр при вызове get (просматривая этот адрес @RequestBody) и не просматривая журналы, вы можете попробовать изменить ResponseEntity<Object> на ResponseEntity<Chart3DataDTO[]>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...