Skip to content

BUG - Submit payload deserialization issue #551

@rosibaj

Description

@rosibaj

Description

When i don't label arrays correctly in a payload, i get a 500 INTERNAL_SERVER_ERROR instead of a schema violation.

This is the error:

{
  "errorId" : "unknown.error",
  "httpStatusCode" : 500,
  "httpStatusName" : "INTERNAL_SERVER_ERROR",
  "requestUrl" : "http://song.qa.argo.cancercollaboratory.org/upload/PACA-CA",
  "datetime" : "2019-12-04T19:40:05.848Z[Etc/UTC]",
  "timestamp" : 1575488405848,
  "message" : "Request processing failed; nested exception is java.lang.IllegalArgumentException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token\n at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: bio.overture.song.server.model.dto.Payload[\"sample\"])",
  "debugMessage" : "[ROOT_CAUSE] -> com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token\n at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: bio.overture.song.server.model.dto.Payload[\"sample\"])",
  "stackTrace" : [
        "org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token",
        "at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: bio.overture.song.server.model.dto.Payload[\"sample\"])",
        "at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)",
        "at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)",
        "at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)",
        "at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)",
        "at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)",
        "at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)",
        "at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)",
        "at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)",
        "at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)",
        "at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)",
        "at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)",
        "at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:176)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74)",
        "at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)",
        "at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)",
        "at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)",
        "at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)",
        "at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)",
        "at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)",
        "at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)",
        "at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)",
        "at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)",
        "at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)",
        "at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)",
        "at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)",
        "at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)",
        "at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:114)",
        "at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:104)",
        "at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)",
        "at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)",
        "at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:118)",
        "at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)",
        "at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)",
        "at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)",
        "at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)",
        "at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)",
        "at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)",
        "at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)",
        "at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)",
        "at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)",
        "at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)",
        "at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)",
        "at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)",
        "at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)",
        "at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)",
        "at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)",
        "at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)",
        "at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)",
        "at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)",
        "at java.base/java.lang.Thread.run(Unknown Source)",
        "Caused by: java.lang.IllegalArgumentException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token",
        "at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: bio.overture.song.server.model.dto.Payload[\"sample\"])",
        "at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3738)",
        "at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3656)",
        "at bio.overture.song.core.utils.JsonUtils.fromJson(JsonUtils.java:128)",
        "at bio.overture.song.server.service.UploadService.parsePayload(UploadService.java:99)",
        "at bio.overture.song.server.service.UploadService.submit(UploadService.java:69)",
        "at bio.overture.song.server.service.UploadService$$FastClassBySpringCGLIB$$61dfa329.invoke(<generated>)",
        "at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)",
        "at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)",
        "at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)",
        "at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295)",
        "at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)",
        "at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)",
        "at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)",
        "at bio.overture.song.server.service.UploadService$$EnhancerBySpringCGLIB$$927276b0.submit(<generated>)",
        "at bio.overture.song.server.controller.UploadController.submit(UploadController.java:59)",
        "at bio.overture.song.server.controller.UploadController$$FastClassBySpringCGLIB$$5eead37d.invoke(<generated>)",
        "at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)",
        "at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)",
        "at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)",
        "at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:69)",
        "at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)",
        "at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)",
        "at bio.overture.song.server.controller.UploadController$$EnhancerBySpringCGLIB$$f1bb36ee.submit(<generated>)",
        "at jdk.internal.reflect.GeneratedMethodAccessor384.invoke(Unknown Source)",
        "at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)",
        "at java.base/java.lang.reflect.Method.invoke(Unknown Source)",
        "at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)",
        "at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)",
        "at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)",
        "at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)",
        "at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)",
        "at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)",
        "at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)",
        "at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)",
        "at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)",
        "... 83 more",
        "Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token",
        "at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: bio.overture.song.server.model.dto.Payload[\"sample\"])",
        "at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)",
        "at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1342)",
        "at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1138)",
        "at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1092)",
        "at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:332)",
        "at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:265)",
        "at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)",
        "at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)",
        "at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:127)",
        "at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)",
        "at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)",
        "at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3733)",
        "... 117 more",
        ""
    ]
}

Expected Behaviour

It should tell me there is a schema violation and that i need to make samples an array, intead of failing before making it to schema validation.

Steps to Reproduce

  1. Go to ARGO qa song.
  2. Submit this payload to the upload endpoint:
curl -X POST \
  https://song.qa.argo.cancercollaboratory.org/upload/PACA-CA \
  -H 'Accept: */*' \
  -H 'Accept-Encoding: gzip, deflate' \
  -H 'Authorization: Bearer 92066829-998c-4aa2-9fc2-b6b241f63ff0' \
  -H 'Cache-Control: no-cache' \
  -H 'Connection: keep-alive' \
  -H 'Content-Length: 1835' \
  -H 'Content-Type: application/json' \
  -H 'Host: song.qa.argo.cancercollaboratory.org' \
  -H 'Postman-Token: 14c3c6ac-3c19-4bb7-963f-9c57b0efa427,258da421-2e2c-4b5a-8c35-4d64af8f0075' \
  -H 'User-Agent: PostmanRuntime/7.20.1' \
  -H 'cache-control: no-cache' \
  -d '{
  "study": "PACA-CA",
  "program_id": "PACA-CA",
  "analysisType": {
    "name": "sequencing_experiment",
    "version": 3
  },
  "submitter_sequencing_experiment_id": "rosi-se-1",
  "sample": 
    {
      "sampleSubmitterId": "sample-rosi-1",
      "sampleType": "DNA",
      "specimen": {
        "specimenSubmitterId": "specimen-rosi-1",
        "specimenClass": "Tumour",
        "specimenType": "Primary tumour - solid tissue"
      },
      "donor": {
        "donorSubmitterId": "donor-rosi-1",
        "donorGender": "female"
      }
    }
  ,
  "file": [
    {
      "fileName": "C0HVY.2_r1.fq",
      "fileSize": 133684363564,
      "fileType": "FASTQ",
      "fileMd5sum": "e4fe8353ae62045642a2124909c5cfa5",
      "fileAccess": "controlled"
    },
    {
      "fileName": "C0HVY.2_r2.fq",
      "fileSize": 133684363564,
      "fileType": "FASTQ",
      "fileMd5sum": "e4fe8353ae62045642a2124909c5cfa5",
      "fileAccess": "controlled"
    }
  ],
  "sequencing_center": "EXT",
  "library_strategy": "WGS",
  "platform": "Illumina",
  "platform_model": "HiSeq 2000",
  "read_group_count": 2,
  "read_group": [
    {
      "insert_size": 298,
      "is_paired_end": true,
      "library_name": "Pond-147580",
      "platform_unit": "74_8",
      "read_length_r1": 150,
      "read_length_r2": 150,
      "sample_barcode": null,
      "submitter_read_group_id": "C0HVY.2"
    },
    {
      "insert_size": 298,
      "is_paired_end": true,
      "library_name": "Pond-147580",
      "platform_unit": "74_8",
      "read_length_r1": 150,
      "read_length_r2": 150,
      "sample_barcode": null,
      "submitter_read_group_id": "D0RE2.1"
    }
  ],
  "sequencing_date":"2014-12-12",
  "experiment": {},
  "workflow": {
    "name": "dna-seq-alignment",
    "short_name": "dna-seq-alignment",
    "version": "0.2.3.0"
  }
}
'

Metadata

Metadata

Assignees

Labels

SP:1Scope ChangeScope change from the initial sprint commitmentbugSomething isn't working

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions