Как отправить объект Java в метод get с помощью JS - PullRequest
0 голосов
/ 18 октября 2019

Я должен выполнить поиск на сервере Java, и мне нужно передать параметры в виде объекта. Я передавал поля поиска в виде строк, используя HttpParams. Но теперь мне нужно передать его как объект, имеющий 9 строк, потому что сонар просто принимает до 7 аргументов. Мне нужно продолжать использовать метод get. Как я могу это сделать?

вот подпись метода get на сервере:

@GetMapping("/buscarPorFiltros")
public ResponseEntity<ProjetoResponse> buscarPorFiltros(PesquisaDTO pesquisa){
}

вот класс PesquisaDTO:

public class PesquisaDTO {

    private Optional<String> dsProjeto;
    private Optional<String> nomeProjeto;
    private Optional<Date> dataInicio;
    private Optional<Date> dataFim;
    private Optional<String> statusProjeto;
    private Optional<String> un;
    private Optional<String> setor;
    private Optional<String> gerenteProjetoNome;
    private Optional<String> serviceType;

   public PesquisaDTO() {
   }

   public String getDsProjeto() {
       return dsProjeto.isPresent() ? dsProjeto.get() : "";
   }

   // others getters similar to getDsProject()

вот этоугловая функция:

 public buscarPorFiltros(dsProjeto, nomeProjeto, statusProjeto, dtInicio, dtFim, un, setor, gerenteProjetoNome, serviceType): Observable<ProjetoResponse> {

      varpesquisa: Pesquisa;

      if (dsProjeto) {
          pesquisa.dsProjeto = dsProjeto;
      }
      if (nomeProjeto) {
          pesquisa.nomeProjeto = nomeProjeto;
      }
      if (statusProjeto) {
          pesquisa.statusProjeto = statusProjeto;
      }
      if (dtInicio && dtFim) {
          pesquisa.dataInicio = dtInicio;
          pesquisa.dataFim = dtFim;
      }
      if (un) {
         pesquisa.un = un;
      }
      if (setor) {
         pesquisa.setor = setor;
     }

     if (gerenteProjetoNome) {
        pesquisa.gerenteProjetoNome = gerenteProjetoNome;
     }

     if (serviceType){
        pesquisa.serviceType = serviceType;
     }

      return this.httpClient.get<ProjetoResponse>(this.applicationUrl + mappingUrls.projetoService.buscarPorFiltros, { pesquisa });

 }

Angular не принимает «pesquisa» в качестве параметра. Он говорит:

Argument of type '{ pesquisa: Pesquisa; }' is not assignable to parameter of type '{ headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: "body"; params?: HttpParams | { [param: string]: string | string[]; }; reportProgress?: boolean; responseType?: "json"; withCredentials?: boolean; }'.   Object literal may only specify known properties, and 'pesquisa' does not exist in type '{ headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: "body"; params?: HttpParams | { [param: string]: string | string[]; }; reportProgress?: boolean; responseType?: "json"; withCredentials?: boolean; }'.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

Вам нужно использовать HttpParams класс Agular для построения строки URL с такими параметрами запроса:

 public buscarPorFiltros(dsProjeto, nomeProjeto, statusProjeto, dtInicio, dtFim, un, setor, gerenteProjetoNome, serviceType): Observable<ProjetoResponse> {
  const requestParams = new HttpParams();

  if (dsProjeto) {
      requestParams.append('dsProjeto', dsProjeto);
  }
  if (nomeProjeto) {
      requestParams.append('nomeProjeto', nomeProjeto);
  }
  if (statusProjeto) {
      requestParams.append('statusProjeto', statusProjeto);
  }
  if (dtInicio && dtFim) {
      requestParams.append('dtInicio', dtInicio);
      requestParams.append('dtFim', dtFim);
  }
  if (un) {
     requestParams.append('un', un);
  }
  if (setor) {
     requestParams.append('setor', setor);
 }

 if (gerenteProjetoNome) {
     requestParams.append('gerenteProjetoNome', gerenteProjetoNome);
 }

 if (serviceType){
     requestParams.append('serviceType', serviceType);
 }

  return this.httpClient.get<ProjetoResponse>(this.applicationUrl + mappingUrls.projetoService.buscarPorFiltros, requestParams);
}

А на стороне сервера вам нужен контроллер, подобный тому, который у вас есть сейчас:

@GetMapping("/buscarPorFiltros")
public ResponseEntity<ProjetoResponse> buscarPorFiltros(PesquisaDTO pesquisa){
}

Также PesquisaDTO должен иметь методы set / get для каждого поля, тогда Spring преобразует http get params в PesquisaDTO object.

0 голосов
/ 18 октября 2019

На стороне сервера:

@GetMapping("/buscarPorFiltros")
@Consumes(MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ProjetoResponse> buscarPorFiltros(String pesquisa ){
    try {
        String result = java.net.URLDecoder.decode(pesquisa, StandardCharsets.UTF_8.name());
        ObjectMapper mapper = new ObjectMapper();
        PesquisaDTO pesquisaDto = mapper.readValue(result, PesquisaDTO.class);

На стороне клиента:

  const params = new HttpParams().set("pesquisa", encodeURIComponent(JSON.stringify(pesquisa)));
  return this.httpClient.get<ProjetoResponse>(this.applicationUrl + mappingUrls.projetoService.buscarPorFiltros, {params});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...