Então, como faço para testar no OffsetDateTime no postman: o objeto é o que segue abaixo:
{"descricao":"Desenvolver as interfaces CRUD cadastro de clientes","status":"ESPERA","prioridade":"MÉDIA","dataCadastro":"2021-06-26T18:28:54.403+00:00","dataPrevista":"2021-06-26T18:28:54.403+00:00","dataConclusao":"2021-06-26T18:28:54.403+00:00","funcionario":{"id":1}}
Porém: a pergunta é como recuperar Atividade nesse componente angular abaixo?
import{HttpResponse}from'@angular/common/http';import{Component,OnInit}from'@angular/core';import{Router}from'@angular/router';import{Atividade}from'src/app/Modelo/Atividade';import{ServiceService}from'src/app/Service/service.service';import{Funcionario}from'src/app/Modelo/Funcionario';@Component({selector:'app-adicionar',templateUrl:'./adicionar.component.html',styleUrls:['./adicionar.component.css']})exportclassAdicionarComponentimplementsOnInit{atividade:Atividade;constructor(privaterouter:Router,privateservice:ServiceService){}ngOnInit():void{}Cadastrar(atividade:Atividade){this.service.createAtividade(atividade).subscribe(data=>{alert("Se agrego com exito...!!!");this.router.navigate(["listar"]);})}}
Como recupero uma atividade com esse modelo?
T
Tobe
No spring sai: Required request body is missing:
L
Lucas_Camara
Parece que está faltando vc configurar o form. Veja essa resposta aqui mesmo do GUJ: Erro angular 8 *ngForm
Do nada, tu mudou de dúvida. Conseguiu resolver o problema do OffsetDateTime?
T
Tobe
A duvida do OffsetTime não: mas talves se conseguir inserir uma atividade, consigo cadastrar junto a data:
L
Lucas_Camara
Entendi. O formato que passei, não deu certo de usar no postman não?
T
Tobe
Não tentei: eu preciso cadastrar uma atividade: depois cadastrar uma atividade com data: a parte do spring está pronta: eu ja consegui que a interface angular liste as atividades que cadastrei pelo postman: Porém: não consigo implementar o cadastro para cadastrar: quando tento cadastrar uma atividade pela interface que construi, a mensagem do spring é: No spring sai: Required request body is missing: = deduso dai que é um problema de construir uma atividade: não sei como instanciar a atividade no AdicionarModulo e recuperar os atributos no componente.html
L
Lucas_Camara
Veja o link que mandei referente ao form em angular. Supondo que vc vá usar template-driven forms, vc deve usar ngModel nos inputs do form indicando a propriedade que será preenchida no objeto. E esse objeto que será preenchido será o que vc irá enviar no requisição http que será recebida pelo endpoint criado no spring.
T
Tobe
Então, já tentei de tudo, não consigo, não funciona!
T
Tobe
O componente está assim:
import{HttpResponse}from'@angular/common/http';import{Component,OnInit}from'@angular/core';import{Router}from'@angular/router';import{FormGroup}from'@angular/forms';import{FormBuilder}from'@angular/forms';import{ReactiveFormsModule}from'@angular/forms';import{FormControl}from'@angular/forms';import{Atividade}from'src/app/Modelo/Atividade';import{ServiceService}from'src/app/Service/service.service';import{Funcionario}from'src/app/Modelo/Funcionario';@Component({selector:'app-adicionar',templateUrl:'./adicionar.component.html',styleUrls:['./adicionar.component.css']})exportclassAdicionarComponentimplementsOnInit{atividade:Atividade;formulario:FormGroup;constructor(privateformBuilder:FormBuilder,privaterouter:Router,privateservice:ServiceService){}ngOnInit():void{this.formulario=this.formBuilder.group({descricao:[null],status:[null],prioridade:[null],funcionario:[null]//dataNascimento:newFormControl(cliente.dataNascimento),})}OnSubmit(){this.service.createAtividade(this.atividade).subscribe(data=>{alert("Se agrego com exito...!!!");this.router.navigate(["listar"]);console.log(this.formulario.value);//this.formAtividade.reset(this.atividade);})}}
Vou tentar:::::::: Como faço para testar ver se a atividade recebe os atributos: estou usando o mozila e o metodo: console.log() mas não sei onde visalizar a saída
L
Lucas_Camara
Com o console.log, tu vê a saída no console do navegador (F12). Outra forma, seria usar o depurador, ou colocando o breakpoint pelo console do navegador ou usando a palavra-chave debugger na linha que vc quer que pare (só funciona com o console do navegador aberto).
T
Tobe
Tenteti de tudo: não tem um exemplo completo:
T
Tobe
Seguindo aquele exemplo que você postou: a teg que não funciona é essa:
this.service.createAtividade(this.atividade).subscribe(data=>{alert("Se agrego com exito...!!!");
Vc está enviando o this.atividade, porém o seu form está sendo preenchido em formulario. Desse jeito, sempre será enviado um valor vazio. Vc deve preencher a variável atividade com os dados da variável formulario (que estará preenchida com os dados do formulário do html).
Tente assim:
this.atividade=this.formulario.value;this.service.createAtividade(this.atividade).subscribe(data=>{alert("Se agrego com exito...!!!");
Ou vc pode passar o formulário direto na requisição.
T
Tobe
Agora consegui compila tudo, falta só isso: adicionar o formulario, para a atividade:
T
Tobe
O ultimo atributo de atividade é um funcionario, que tem id, nome e cpf: nesse caso o que vem do selectbox é uma string, isso da um erro: como posso dar um system.outprintln() e visualizae esses dados: estou usando o visual studio code?
Tem que usar o console.log e ver no console do navegador.
Nesse caso, vc pode passar apenas o id do funcionário na requisição é tratar isso no backend (por exemplo, recuperando o funcionário do banco usando esse ID recebido).
T
Tobe
Não consegui o front-end: vou voltar para postman e tentar inserir a data
T
Tobe
Aquela data que você me passou preci de aspas simples ou duplas?
T
Tobe
Consegui cadastrar as datas o back-end, esta perfeito
L
Lucas_Camara
Pelo postman ou pela tela da aplicação?
T
Tobe
pelo postmam!
Estou tendo problema na interface com com a tag: [formGroup]: a unica forma de recuperar uma atividade do html abaixo e enviar para component é através dessas tag angular, ou tem outra forma?
Como tinha postado, o angular te fornece 2 formas de tratar um form (dê uma lida no link que mandei antes). Dessa forma que vc fez é usando formGroup junto com formControl para cada item do formulário. A outra forma é usando o ngModel. Para seu caso, acho que o ngModel será mais simples de resolver seu problema.
Supondo que tenha um campo que preencha a descrição da atividade:
Agora surgiu uma ambiguidade do controler: como se resolve esse mapeamento: Preciso preencher o selectbox com nome dos funcionarios: para cadadastrar quem fez a atividade?
No meu caso o console não apresenta nada utiizo o mozila!
Precisa testar ve se a conexão tras os nomes?
O primeiro array é preenchido pelo funcionario.service no metodo: RetornaFuncionarios() e não preenche o selectbox:::::: precisaria verificar o array preenchido com funcionario.service
O segundo array preenchido com os nomes, carrega o selectbox
Vish: tem alguns erros ve se pode me ajudar: primeiro, deveria ter uma forma de pegar os atributos individuais, como abaixo: porém, a única forma que consegue chegar no spring e lançar uma exceção é a primeira linha aquela que você me enviou: preciso disso poque o nome dos funcionários estão no selectbox, e é preciso pegar esse nome, e lá no spring com esse nome eu pego o funcionario para inserir na atividade e dai cadastrar a atividade:
Acho que vc não pode ter duas propriedades no componente com o mesmo nome não.
L
Lucas_Camara
Uma coisa, como é a estrutura do json que tem que passar para o backend?
T
Tobe
Estou usando o crome e aprendi verificar, na verdade o problema é o funcionaio porque é um objeto: resolvi o problema criando um funcionario e adicionando a atividade, agora falta pegar o value do NGvalue e passar para o nome do funcionario: como faço para pegar esse valor:
<divclass="form-group"><labelfor="selectFuncionario">FUNCIONÁRIO</label><selectclass="form-control"id="funcionario"formControlName="funcionario"style="background-color: lightblue;"><option*ngFor="let funcionario of nomeDosFuncionarios"[ngValue]="funcionario">{{funcionario}}<!-- <option selected>SELECIONE</option><option>PompeoCesardaSilva</option><option>Alexandrovina</option><option>Catarina</option>--></option></select></div>
Vc não deveria está usando o nome do funcionário assim. O nome é um dado fraco para ser usado na identificação de algum registro. O melhor seria usar um ID. Assim, vc poderia retornar a lista de funcionários do endpoint e usar o ID como valor na combobox e o nome como label.
T
Tobe
Na verdade eu seleciono o nome do funcionario no selectbox e envio para spring, no spring com o nome do funcionario eu busco u funcionário todo ai eu adiciono o funcionario na atividade e cadastro a atividade:
sabe uma solução para o selectbox receber esses nomes?
L
Lucas_Camara
Se tiver 2 funcionarios com mesmo nome?
Tente assim:
<select[(ngModel)]="atividade.nomeSelecionado"><option*ngFor="let nome of nomesFuncionarios"[ngValue]="nome">{{nome}}</option></select>
Altere para usar formControl em vez de ngModel.
T
Tobe
O meu está assim ó, quando eu uso o array preenchido ele funciona, quando uso o outro array que tras os nomes ele não funciona:
//nomeDosFuncionarios:String[];nomeDosFuncionarios:String[]=["Pompeo Cesar da Silva","maria","joao"];
O meu selectbox está assim: você consegue usar as minhas variaveis pra ficar mais óbvio:
<selectclass="form-control"id="funcionario"formControlName="funcionario"style="background-color: lightblue;"><option*ngFor="let funcionario of nomeDosFuncionarios"[ngValue]="funcionario">{{funcionario}}</option></select>
O array está sendo preenchido assim: por isso penso que tem erro entre <String[]> e String[] :
Mas quem tah chamando RetornaFuncionarios? Ou RetornaFuncionarios é uma função que está declarada no próprio componente?
T
Tobe
Está no componente:
import{Component,OnInit}from'@angular/core';import{Router}from'@angular/router';import{FormGroup,FormBuilder,Validators}from'@angular/forms';import{ServiceService}from'../../Service/service.service';import{FuncionarioService}from'../../Service/funcionario.service';import{Atividade}from'src/app/Modelo/Atividade';import{Funcionario}from'src/app/Modelo/Funcionario';import{Observable}from'rxjs';@Component({selector:'app-adicionar',templateUrl:'./adicionar.component.html',styleUrls:['./adicionar.component.css']})exportclassAdicionarComponentimplementsOnInit{nomeDosFuncionarios:String[];//nomeDosFuncionarios:String[]=["Pompeo Cesar da Silva","maria","joao"];funcio:Funcionario;atividade:Atividade;constructor(privatefuncionarioService:FuncionarioService,privateformBuilder:FormBuilder,privateservice:ServiceService,privaterouter:Router){this.RetornaFuncionarios();this.funcio=newFuncionario;this.funcio.id=1this.funcio.cpf='';this.funcio.nome='';this.funcio.cargo='';}formulario:any=FormGroup;ngOnInit():void{this.formulario=this.formBuilder.group({descricao:[''],status:[''],prioridade:[''],funcionario:[''],dataPrevista:[newDate]});}RetornaFuncionarios(){this.funcionarioService.getNomeFuncionarios().subscribe(data=>{this.nomeDosFuncionarios=data;});console.log(this.funcionarioService);}OnSubmit(){this.funcio.nome=this.formulario.get('funcionario').valuethis.atividade=this.formulario.value;this.atividade.funcionario=this.funcio;console.log(this.atividade);this.service.createAtividade(this.atividade).subscribe(data=>{alert("Se agrego com exito...!!!");this.router.navigate(["listar"]);console.log(this.atividade);this.formulario.reset(this.atividade);})}
Nâo. A anotação @CrossOrigin tem que ser colocada lah no projeto spring.
T
Tobe
No controler está assim:
packagecom.petter.tasks.api.controller;importjava.util.List;importjavax.validation.Valid;importorg.springframework.http.HttpStatus;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.CrossOrigin;importorg.springframework.web.bind.annotation.DeleteMapping;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.PutMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestController;importcom.petter.tasks.domain.exception.CadastroFuncionarioException;importcom.petter.tasks.domain.model.Atividade;importcom.petter.tasks.domain.model.Funcionario;importcom.petter.tasks.domain.service.AtividadeService;importcom.petter.tasks.domain.service.FuncionarioService;importlombok.AllArgsConstructor;@CrossOrigin(origins="http://localhost:4200",maxAge=3600)@AllArgsConstructor@RestController@RequestMapping("/atividades")publicclassAtividadeController{privateAtividadeServiceas;//////////////////LISTA TODAS AS ATIVIDADES@GetMappingpublicList<Atividade>listar(){System.out.println("chegou aui");returnas.listar();}```
L
Lucas_Camara
Desse jeito acho que resolve. (poderia ser soh @CrossOrigin também)
T
Tobe
Pelo que pesquisei acho que tem haver
com: import { Observable } from ‘rxjs’;
L
Lucas_Camara
Esse erro tem a ver com CORS, que é uma política de segurança do protocolo HTTP. Se o servidor não liberar, requisições vindas de outros domínios não serão processadas. Com isso, o servidor tem que permitir.
o overload matches this call.
Overload 1 of 15, ‘(url: string, options: { headers?: HttpHeaders | { [header: string]: string | string[]; } | undefined; observe: “events”; context?: HttpContext | undefined; params?: HttpParams | { …; } | undefined; reportProgress?: boolean | undefined; responseType?: “json” | undefined; withCredentials?: boolean | undefined; }): Observable<…>’, gave the following error.
Argument of type ‘number’ is not assignable to parameter of type ‘{ headers?: HttpHeaders | { [header: string]: string | string[]; } | undefined; observe: “events”; context?: HttpContext | undefined; params?: HttpParams | { …; } | undefined; reportProgress?: boolean | undefined; responseType?: “json” | undefined; withCredentials?: boolean | undefined; }’.
L
Lucas_Camara
Ah sim, a função delete está sendo chamada do jeito errado. O segundo parâmetro é outra coisa.
Como está a URL do endpoint que realiza o delete?
T
Tobe
Assim:
///////////////EXCLUI AS ATIVIDADES////////////////////////////////////@DeleteMapping("/{atividadeId}")publicResponseEntity<Void>remover(@PathVariableLongatividadeId){if(!as.existsById(atividadeId)){returnResponseEntity.notFound().build();}as.excluir(atividadeId);returnResponseEntity.noContent().build();//return cr.findById(clienteId).map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());}}