Restful Service Registry Response Format

564 views
Skip to first unread message

Dewi Suci Rafianti

unread,
May 19, 2021, 5:43:48 AM5/19/21
to CAS Community
Hello, 

I'm configuring CAS v6.3 to use restful service registry based on this documentation (https://apereo.github.io/cas/6.3.x/services/REST-Service-Management.html#restful-service-registry).

When I run CAS server, I got error like this. 

Caused by: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `[Ljava.io.Serializable;` from Object value (token `JsonToken.START_OBJECT`); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `[Ljava.io.Serializable;` from Object value (token `JsonToken.START_OBJECT`) at [Source: (PushbackInputStream); line: 1, column: 1] at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:285) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:243) at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:105) ... 193 more Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `[Ljava.io.Serializable;` from Object value (token `JsonToken.START_OBJECT`) at [Source: (PushbackInputStream); line: 1, column: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1603) at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1377) at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1324) at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.handleNonArray(ObjectArrayDeserializer.java:343) at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:194) at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:24) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4591) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3599) at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:274) ... 195 more

Here is the rest api response that I provided. 

{"@class" : "org.apereo.cas.services.RegexRegisteredService", 
  "serviceId" : "^(https|imaps)://.*", 
  "name" : "HTTPS and IMAPS", 
  "id" : 10000001}

It's in JSON format. Is there any specific format that I should provide?
Thank you

Pablo Vidaurri

unread,
May 20, 2021, 8:06:35 PM5/20/21
to CAS Community, srde...@gmail.com
are you returning a 200?

Is that JSON what you actually received or is it what you think you are sending?

Pablo Vidaurri

unread,
May 20, 2021, 8:07:36 PM5/20/21
to CAS Community, Pablo Vidaurri, srde...@gmail.com
Since you have it setup as a webservice, have you tried calling postman to see what you actually get back?

Dewi Suci Rafianti

unread,
Aug 3, 2021, 8:39:50 AM8/3/21
to CAS Community, Pablo Vidaurri, Dewi Suci Rafianti
Thank you for your answer. 
Yes, it happens because of some error in webservice.

Now, CAS can access service registry with this format from rest api
{
   "@class" : "org.apereo.cas.services.RegexRegisteredService", 
   "serviceId" : "^(https|imaps)://.*", 
   "name" : "HTTPS and IMAPS", 
   "id" : 10000001
}

However, I need to add attribute release policy to service registry. So the format will be like this.
{
   "@class": "org.apereo.cas.services.RegexRegisteredService",
   "serviceId": "^(http|https)://localhost.*",
   "name": "Localhost",
   "id": "25062021",
   "evaluationOrder": 0
   "description": "localhost app",
   "logoutType": "BACK_CHANNEL",      
   "responseType": "REDIRECT",
   "attributeReleasePolicy": {
       "@class": "org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy",
       "allowedAttributes": ["java.util.ArrayList",["cn","sn","mail","employeeNumber"]]
    }
}

But, I got error like this 
java.lang.IllegalArgumentException: Cannot deserialize value of type `java.lang.String` from Array value (token `JsonToken.START_ARRAY`)
 at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: org.apereo.cas.services.RegexRegisteredService["attributeReleasePolicy"]->org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy["allowedAttributes"]->java.util.ArrayList[1])
        at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4312) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:4243) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at org.apereo.cas.services.DefaultRegisteredServiceEntityMapper.toRegisteredService(DefaultRegisteredServiceEntityMapper.java:25) ~[cas-server-support-rest-service-registry-6.3.0.jar!/:6.3.0]
        at jdk.internal.reflect.GeneratedMethodAccessor126.invoke(Unknown Source) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:499) ~[spring-cloud-context-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at com.sun.proxy.$Proxy231.toRegisteredService(Unknown Source) ~[?:?]
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[?:?]
        at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) ~[?:?]
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[?:?]
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[?:?]
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[?:?]
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
        at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[?:?]
        at org.apereo.cas.services.RestfulServiceRegistry.load(RestfulServiceRegistry.java:88) ~[cas-server-support-rest-service-registry-6.3.0.jar!/:6.3.0]
        at jdk.internal.reflect.GeneratedMethodAccessor132.invoke(Unknown Source) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:499) ~[spring-cloud-context-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at com.sun.proxy.$Proxy229.load(Unknown Source) ~[?:?]
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[?:?]
        at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[?:?]
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[?:?]
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[?:?]
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[?:?]
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
        at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[?:?]
        at org.apereo.cas.services.DefaultChainingServiceRegistry.load(DefaultChainingServiceRegistry.java:63) ~[cas-server-core-services-registry-6.3.0.jar!/:6.3.0]
        at jdk.internal.reflect.GeneratedMethodAccessor132.invoke(Unknown Source) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:499) ~[spring-cloud-context-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at com.sun.proxy.$Proxy232.load(Unknown Source) ~[?:?]
        at org.apereo.cas.services.AbstractServicesManager.load(AbstractServicesManager.java:226) ~[cas-server-core-services-registry-6.3.0.jar!/:6.3.0]
        at org.apereo.cas.services.ChainingServicesManager.lambda$load$12(ChainingServicesManager.java:143) ~[cas-server-core-services-registry-6.3.0.jar!/:6.3.0]
        at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271) ~[?:?]
        at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[?:?]
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[?:?]
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[?:?]
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[?:?]
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
        at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[?:?]
        at org.apereo.cas.services.ChainingServicesManager.load(ChainingServicesManager.java:144) ~[cas-server-core-services-registry-6.3.0.jar!/:6.3.0]
        at org.apereo.cas.services.ChainingServicesManager$$FastClassBySpringCGLIB$$d1902915.invoke(<generated>) ~[cas-server-core-services-registry-6.3.0.jar!/:6.3.0]
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.apereo.cas.services.ChainingServicesManager$$EnhancerBySpringCGLIB$$204b8855.load(<generated>) ~[cas-server-core-services-registry-6.3.0.jar!/:6.3.0]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
        at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282) ~[spring-core-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.cloud.context.scope.GenericScope$LockedScopedProxyFactoryBean.invoke(GenericScope.java:499) ~[spring-cloud-context-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at com.sun.proxy.$Proxy135.load(Unknown Source) ~[?:?]
        at org.apereo.cas.services.ServicesManagerScheduledLoader.run(ServicesManagerScheduledLoader.java:32) ~[cas-server-core-services-registry-6.3.0.jar!/:6.3.0]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) ~[spring-context-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.2.12.RELEASE.jar!/:5.2.12.RELEASE]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?]
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) ~[?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
        at java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Array value (token `JsonToken.START_ARRAY`)
 at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: org.apereo.cas.services.RegexRegisteredService["attributeReleasePolicy"]->org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy["allowedAttributes"]->java.util.ArrayList[1])
        at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1603) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1377) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1282) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.std.StdDeserializer._parseString(StdDeserializer.java:1288) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:216) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:182) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.std.StringCollectionDeserializer.deserialize(StringCollectionDeserializer.java:25) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:324) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:225) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:197) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:135) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:105) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:263) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:138) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:324) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:225) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:197) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:135) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:105) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:263) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:74) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4307) ~[jackson-databind-2.12.0.jar!/:2.12.0]
        ... 84 more

Is the format not right? I got the format from CAS documentation.

He Vincent

unread,
Aug 3, 2021, 9:18:28 PM8/3/21
to CAS Community, srde...@gmail.com, Pablo Vidaurri
I think JSON, all shoul use {}, here is my example:
  "attributeReleasePolicy" : {
    "@class" : "org.apereo.cas.services.ReturnMappedAttributeReleasePolicy",
    "allowedAttributes" : {
      "@class" : "java.util.TreeMap",
      "givenName" : "firstname",
      "sn" : "lastname",
      "email" : "email"
Reply all
Reply to author
Forward
0 new messages