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:
Erro ao consumir uma api java no angular
27 Respostas
Parece que a API java está esperando um ArrayList ([]), e vc está enviando uma String vazia.
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?
Posta como vc está fazendo a requisição do frontend, e como está o método do endpoint que está sendo chamado no backend.
Só um momento.
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.
Entendi.
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
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:

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)
}
body da requisição:
-
{id: “”, nome: “Dhonata Borges de Oliveira”, nascimento: “2022-02-15T03:00:00.000Z”, sexo: “masculino”,…}
-
cargos: “cado.id”
-
cpf: “[CPF removido]”
-
disciplinas: “”
-
id: “”
-
nascimento: “2022-02-15T03:00:00.000Z”
-
nome: “Dhonata Borges de Oliveira”
-
rg: “mg19599000”
-
sexo: “masculino”
-
telefone: “[telefone removido]”
-
turmas: “”
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)
Vou tentar.
{"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"}
Seria esse?
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: [],
Entendi, essa disciplina esta relacionada com a classe profissional com anotação @ManyToMany. Isso pode interferir no front?
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?
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: []
}
Parece que, em algum template, vc está tentando usar um number (cargo.id) de forma errada num ngFor.
Estou usando assim:
Selecione a Cargo
<mat-select [(value)]=“cargos” >
<mat-option *ngFor=“let cargo of cargos” value=“cargos.id”>{{cargo.nomeCargo}}
Segui alguns tutoriais que ensinavam semelhante a esse.
Segui sua dica e consegui resolver esse problema.
Muito obrigado!
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.
Entendi Lucas, obrigado pela dica. Eu sou iniciante na programação ainda tenho muito para aprender.rsrsrs…






