Erro ao consumir uma api java no angular

27 respostas Resolvido
javaprogramaçãoangular
Dhonata

Olá pessoal!
Estou tendo um probleminha na minha aplicação web spring boot com angular.
Ao tentar salvar um formulário estou tendo essa mensagem de erro:

27 Respostas

Lucas_Camara

Parece que a API java está esperando um ArrayList ([]), e vc está enviando uma String vazia.

Dhonata

Entendi. Já meche em tudo aqui para tentar descobrir mais não tive êxodo.
Esse problema apareceu quando fiz as relações da entidades. Você acha que tem alguma relação?

Lucas_Camara

Posta como vc está fazendo a requisição do frontend, e como está o método do endpoint que está sendo chamado no backend.

Dhonata

Só um momento.

Dhonata

Esse é o componente:
image
image

Dhonata

Lucas_Camara

No console do navegador, como está o body da requisição?

Quando for postar código, evite sempre que puder, enviar imagens do código. É bem melhor copiar e colá-lo na postagem. Fica melhor de entender.

Dhonata

Entendi.

Dhonata

No console do navegador:

profissional-create.component.ts:97 HttpErrorResponse {headers: HttpHeaders, status: 400, statusText: 'OK', url: 'http://localhost:8080/profissionais', ok: false, }
core.mjs:6495 ERROR TypeError: Cannot read properties of undefined (reading '0')
    at profissional-create.component.ts:100:34
    at Object.error (Subscriber.js:110:1)
    at SafeSubscriber._error (Subscriber.js:64:1)
    at SafeSubscriber.error (Subscriber.js:40:1)
    at OperatorSubscriber._error (Subscriber.js:64:1)
    at OperatorSubscriber.error (Subscriber.js:40:1)
    at OperatorSubscriber._error (Subscriber.js:64:1)
    at OperatorSubscriber.error (Subscriber.js:40:1)
    at OperatorSubscriber._error (Subscriber.js:64:1)
    at OperatorSubscriber.error (Subscriber.js:40:1)
defaultErrorLogger @ core.mjs:6495
handleError @ core.mjs:6543
next @ core.mjs:26487
(anonymous) @ Subscriber.js:110
_next @ Subscriber.js:60
next @ Subscriber.js:31
(anonymous) @ Subject.js:31
errorContext @ errorContext.js:19
next @ Subject.js:26
emit @ core.mjs:22776
(anonymous) @ core.mjs:25903
invoke @ zone.js:372
run @ zone.js:134
runOutsideAngular @ core.mjs:25776
onHandleError @ core.mjs:25903
handleError @ zone.js:376
runTask @ zone.js:181
invokeTask @ zone.js:487
ZoneTask.invoke @ zone.js:476
data.args.<computed> @ zone.js:2541
setTimeout (async)
scheduleTask @ zone.js:2543
scheduleTask @ zone.js:393
onScheduleTask @ zone.js:283
scheduleTask @ zone.js:386
scheduleTask @ zone.js:221
scheduleMacroTask @ zone.js:244
scheduleMacroTaskWithCurrentZone @ zone.js:679
(anonymous) @ zone.js:2585
proto.<computed> @ zone.js:975
setTimeout @ timeoutProvider.js:4
reportUnhandledError @ reportUnhandledError.js:4
(anonymous) @ Subscriber.js:117
_error @ Subscriber.js:64
error @ Subscriber.js:40
_error @ Subscriber.js:64
error @ Subscriber.js:40
_error @ Subscriber.js:64
error @ Subscriber.js:40
_error @ Subscriber.js:64
error @ Subscriber.js:40
onLoad @ http.mjs:1827
invokeTask @ zone.js:406
onInvokeTask @ core.mjs:25864
invokeTask @ zone.js:405
runTask @ zone.js:178
invokeTask @ zone.js:487
invokeTask @ zone.js:1600
globalZoneAwareCallback @ zone.js:1637
load (async)
customScheduleGlobal @ zone.js:1752
scheduleTask @ zone.js:393
onScheduleTask @ zone.js:283
scheduleTask @ zone.js:386
scheduleTask @ zone.js:221
scheduleEventTask @ zone.js:247
(anonymous) @ zone.js:1907
(anonymous) @ http.mjs:1900
_trySubscribe @ Observable.js:37
(anonymous) @ Observable.js:31
errorContext @ errorContext.js:19
subscribe @ Observable.js:22
doInnerSub @ mergeInternals.js:19
outerNext @ mergeInternals.js:14
OperatorSubscriber._next @ OperatorSubscriber.js:9
next @ Subscriber.js:31
(anonymous) @ innerFrom.js:51
_trySubscribe @ Observable.js:37
(anonymous) @ Observable.js:31
errorContext @ errorContext.js:19
subscribe @ Observable.js:22
mergeInternals @ mergeInternals.js:50
(anonymous) @ mergeMap.js:13
(anonymous) @ lift.js:10
(anonymous) @ Observable.js:26
errorContext @ errorContext.js:19
subscribe @ Observable.js:22
(anonymous) @ filter.js:6
(anonymous) @ lift.js:10
(anonymous) @ Observable.js:26
errorContext @ errorContext.js:19
subscribe @ Observable.js:22
(anonymous) @ map.js:6
(anonymous) @ lift.js:10
(anonymous) @ Observable.js:26
errorContext @ errorContext.js:19
subscribe @ Observable.js:22
create @ profissional-create.component.ts:93
ProfissionalCreateComponent_Template_button_click_59_listener @ profissional-create.component.html:70
executeListenerWithErrorHandling @ core.mjs:15291
wrapListenerIn_markDirtyAndPreventDefault @ core.mjs:15329
(anonymous) @ platform-browser.mjs:546
invokeTask @ zone.js:406
onInvokeTask @ core.mjs:25864
invokeTask @ zone.js:405
runTask @ zone.js:178
invokeTask @ zone.js:487
invokeTask @ zone.js:1600
globalZoneAwareCallback @ zone.js:1626
Show 49 more frames
Lucas_Camara

O que tem nessa linha: profissional-create.component.ts:100:34? E o body da requisição que vc pega na aba network do console do navegador:

image

Dhonata

profissional-create.component.ts:100:34 ?
} else if (err.error.errors[0].message === “número do registro de contribuinte individual brasileiro (CPF) inválido”) {
this.service.message(“CPF inválido!”)
console.log(err)
}

Dhonata

body da requisição:

  1. {id: “”, nome: “Dhonata Borges de Oliveira”, nascimento: “2022-02-15T03:00:00.000Z”, sexo: “masculino”,…}

  2. cargos: “cado.id”

  3. cpf: “[CPF removido]”

  4. disciplinas: “”

  5. id: “”

  6. nascimento: “2022-02-15T03:00:00.000Z”

  7. nome: “Dhonata Borges de Oliveira”

  8. rg: “mg19599000”

  9. sexo: “masculino”

  10. telefone: “[telefone removido]”

  11. turmas: “”

Lucas_Camara

Pelo erro, parece que nessa parte:

err.error.errors[0]

provavelmente o array errors está undefined. Tem certeza que o response da requisição está nessa estrutura? (vc consegue ver o retorno do backend na aba network do console do navegador)

Dhonata

Vou tentar.

Dhonata
{"timestamp":"2022-02-06T00:55:08.390+00:00","status":400,"error":"Bad Request","trace":"org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot coerce empty String (\"\") to element of `java.util.ArrayList<com.borges.diario_eletronico.domain.Disciplina>` (but could if coercion was enabled using `CoercionConfig`); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot coerce empty String (\"\") to element of `java.util.ArrayList<com.borges.diario_eletronico.domain.Disciplina>` (but could if coercion was enabled using `CoercionConfig`)\n at [Source: (PushbackInputStream); line: 1, column: 187] (through reference chain: com.borges.diario_eletronico.domain.Profissional[\"disciplinas\"])\r\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:389)\r\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:342)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:185)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:133)\r\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\r\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:764)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:834)\r\nCaused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot coerce empty String (\"\") to element of `java.util.ArrayList<com.borges.diario_eletronico.domain.Disciplina>` (but could if coercion was enabled using `CoercionConfig`)\n at [Source: (PushbackInputStream); line: 1, column: 187] (through reference chain: com.borges.diario_eletronico.domain.Profissional[\"disciplinas\"])\r\n\tat com.fasterxml.jackson.databind.exc.InvalidFormatException.from(InvalidFormatException.java:67)\r\n\tat com.fasterxml.jackson.databind.DeserializationContext.reportBadCoercion(DeserializationContext.java:1666)\r\n\tat com.fasterxml.jackson.databind.deser.std.StdDeserializer._checkCoercionFail(StdDeserializer.java:1432)\r\n\tat com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromString(CollectionDeserializer.java:308)\r\n\tat com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:250)\r\n\tat com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28)\r\n\tat com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)\r\n\tat com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:402)\r\n\tat com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)\r\n\tat com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)\r\n\tat com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)\r\n\tat com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3601)\r\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:378)\r\n\t... 51 more\r\n","message":"JSON parse error: Cannot coerce empty String (\"\") to element of `java.util.ArrayList<com.borges.diario_eletronico.domain.Disciplina>` (but could if coercion was enabled using `CoercionConfig`); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot coerce empty String (\"\") to element of `java.util.ArrayList<com.borges.diario_eletronico.domain.Disciplina>` (but could if coercion was enabled using `CoercionConfig`)\n at [Source: (PushbackInputStream); line: 1, column: 187] (through reference chain: com.borges.diario_eletronico.domain.Profissional[\"disciplinas\"])","path":"/profissionais"}
Dhonata

Seria esse?

Lucas_Camara
Solucao aceita

Não foi esse que pedi, mas serve.

O problema é que vc está passando a propriedade disciplinas como string vazia (''). E está tentando receber essa string vazia na classe Disciplina. Essa conversão não é possível. Ou vc passa um os dados corretos da disciplina em um array, ou passa um array vazio ([]).

A propriedade prof do componente ProfissionalCreateComponent, possui uma outra propriedade chamada disciplina sendo inicializada com uma string vazia: ''. Em vez disso, tente passar uma array vazio:

disciplinas: [],
Dhonata

Entendi, essa disciplina esta relacionada com a classe profissional com anotação @ManyToMany. Isso pode interferir no front?

Lucas_Camara

O problema é a forma como as disciplinas estão sendo enviadas do front para o back. Se as disciplinas são um array no back, como que elas estão sendo passadas como string pelo front?

Dhonata

Entendi, eu fiz essa mudança:
export class ProfissionalCreateComponent implements OnInit {

cursos: Disciplina[] = [{id: ‘’, nomeDisciplina: ‘’, professores:[]}];

cargos: Cargo[] = [{id: ‘’, nomeCargo: ‘’, professor:[] }];

turmas: Turma[] = [{id: ‘’, nomeTurma: ‘’, professor:[], aluno:[]}];

prof: Profissional = {

id: ‘’,

nome: ‘’,

nascimento: ‘’,

sexo: ‘’,

cpf: ‘’,

rg: ‘’,

telefone: ‘’,

disciplinas:[],

cargos: [],

turmas: []

}
Dhonata

Depois da mudança, quando tento selecionar um item retorna esse erro:

Lucas_Camara

Parece que, em algum template, vc está tentando usar um number (cargo.id) de forma errada num ngFor.

Dhonata
Estou usando assim:



Selecione a Cargo

<mat-select [(value)]=“cargos” >

<mat-option *ngFor=“let cargo of cargos” value=“cargos.id”>{{cargo.nomeCargo}}
Dhonata

Segui alguns tutoriais que ensinavam semelhante a esse.

Dhonata

Segui sua dica e consegui resolver esse problema.
Muito obrigado!

Lucas_Camara

Bacana. Só mais uma coisa. Parece que vc está usando as entidades para receber os valores no endpoint. Com o tempo, vc vai ver que isso não é uma boa prática, pois deixa seu código muito amarrado e difícil e fazer manutenção.

O melhor seria ter uma classe específica para receber esses dados, por exemplo:

public class CriarProfissionalCommand {
  private Long id;
  private String nome;
  // todos os outros campos
}

E, a partir dessa classe, vc iria montar as entidades para poder gravar no banco.

Dhonata

Entendi Lucas, obrigado pela dica. Eu sou iniciante na programação ainda tenho muito para aprender.rsrsrs…

Criado 5 de fevereiro de 2022
Ultima resposta 6 de fev. de 2022
Respostas 27
Participantes 2