Erro ao consumir uma api java no angular

27 respostas Resolvido
javaprogramaçãoangular
D

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

L

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

D

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?

L

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

D

Só um momento.

D

Esse é o componente:
image
image

D

L

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.

D

Entendi.

D

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
L

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

D

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)
}

D

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: “”

L

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)

D

Vou tentar.

D
{"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"}
D

Seria esse?

L
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: [],
D

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

L

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?

D

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: []

}
D

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

L

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

D
Estou usando assim:



Selecione a Cargo

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

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

Segui alguns tutoriais que ensinavam semelhante a esse.

D

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

L

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.

D

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