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:
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: “133.120.446-18”
-
disciplinas: “”
-
id: “”
-
nascimento: “2022-02-15T03:00:00.000Z”
-
nome: “Dhonata Borges de Oliveira”
-
rg: “mg19599000”
-
sexo: “masculino”
-
telefone: “38998736845”
-
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?