Hello devs,
I'm currently migrating a WFS service to Geoserver 2.20 (from 2.7) and ran into a mapping issue. The exception presented was "java.lang.ClassCastException: class java.math.BigDecimal cannot be cast to class java.lang.Boolean". After some digging I found that Oracle JDBC driver always returns BigDecimal for its database number types where boolean fields are modeled as "number(1)". This is the oracle convention. The way mapping can be leveraged in GeoTools seems to be by registering a ConverterFactory using the ServiceLoader in Java. The quick fix in my case was to add a custom converter to the classpath. I realize there's an existing factory doing Boolean conversion which might be a natural candidate. I am wondering if GT would welcome such a change: https://github.com/lislei/geotools/commits/GML_BigDecimal_to_Boolean Best regards, Leif Lislegård
java.lang.RuntimeException: java.lang.ClassCastException: class java.math.BigDecimal cannot be cast to class java.lang.Boolean (java.math.BigDecimal and java.lang.Boolean are in module java.base of loader 'bootstrap') at org.geotools.xsd.Encoder.processChildren(Encoder.java:1024) at org.geotools.xsd.Encoder.encode(Encoder.java:651) at org.geotools.xsd.Encoder.encode(Encoder.java:551) at org.geoserver.wfs.xml.GML3OutputFormat.encode(GML3OutputFormat.java:392) at org.geoserver.wfs.xml.GML3OutputFormat.write(GML3OutputFormat.java:318) at org.geoserver.wfs.WFSGetFeatureOutputFormat.write(WFSGetFeatureOutputFormat.java:199) at org.geoserver.ows.Dispatcher.response(Dispatcher.java:1020) at org.geoserver.ows.Dispatcher.handleRequestInternal(Dispatcher.java:275) at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:645) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:295) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:353) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at org.geoserver.filters.ThreadLocalsCleanupFilter.doFilter(ThreadLocalsCleanupFilter.java:28) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:73) at org.geoserver.ows.HTTPHeadersCollector.doFilter(HTTPHeadersCollector.java:48) at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:70) at org.geoserver.filters.SpringDelegatingFilter.doFilter(SpringDelegatingFilter.java:43) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at org.geoserver.platform.AdvancedDispatchFilter.doFilter(AdvancedDispatchFilter.java:39) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at org.geoserver.filters.LoggingFilter.doFilter(LoggingFilter.java:102) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at org.geoserver.filters.XFrameOptionsFilter.doFilter(XFrameOptionsFilter.java:77) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at org.geoserver.filters.GZIPFilter.doFilter(GZIPFilter.java:48) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at org.geoserver.filters.SessionDebugFilter.doFilter(SessionDebugFilter.java:49) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at org.geoserver.filters.FlushSafeFilter.doFilter(FlushSafeFilter.java:42) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:82) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) at ... Caused by: java.lang.ClassCastException: class java.math.BigDecimal cannot be cast to class java.lang.Boolean (java.math.BigDecimal and java.lang.Boolean are in module java.base of loader 'bootstrap') at org.geotools.xs.bindings.XSBooleanBinding.encode(XSBooleanBinding.java:113) at org.geotools.gml2.simple.FeatureCollectionEncoderDelegate.encodeSimpleBinding(FeatureCollectionEncoderDelegate.java:292) at org.geotools.gml2.simple.FeatureCollectionEncoderDelegate.encodeValue(FeatureCollectionEncoderDelegate.java:221) at org.geotools.gml2.simple.FeatureCollectionEncoderDelegate.encodeFeature(FeatureCollectionEncoderDelegate.java:183) at org.geotools.gml2.simple.FeatureCollectionEncoderDelegate.encode(FeatureCollectionEncoderDelegate.java:137) at org.geotools.xsd.Encoder.processChildren(Encoder.java:1022) ... 66 common frames omitted
_______________________________________________ GeoTools-Devel mailing list GeoTools-Devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/geotools-devel