将 Saxon 与 GeoTools 结合使用
Using Saxon with GeoTools
我正在尝试使用 GeoTools 使一个项目工作,该项目具有使用 Saxonica 的依赖项。到目前为止,没有运气
项目 pom.xml
依赖项:
<dependencies>
<dependency>
<groupId>org.auscope.portal</groupId>
<artifactId>portal-core</artifactId>
<version>${portal.core.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>14.2</version>
</dependency>
</dependencies>
portal-core
pom.xml
相关依赖项:
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-xom</artifactId>
<version>8.7</version>
</dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-xpath</artifactId>
<version>8.7</version>
<optional>false</optional>
</dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-dom</artifactId>
<version>8.7</version>
<optional>false</optional>
</dependency>
SLDController.java
代码:
StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);
StyledLayerDescriptor sld = styleFactory.createStyledLayerDescriptor();
sld.setName("example");
sld.setAbstract("Example Style Layer Descriptor");
UserLayer layer = styleFactory.createUserLayer();
layer.setName("layer");
FeatureTypeConstraint constraint = styleFactory.createFeatureTypeConstraint("Feature", Filter.INCLUDE, null);
layer.layerFeatureConstraints().add(constraint);
Style style = styleFactory.createStyle();
style.getDescription().setTitle("Style");
style.getDescription().setAbstract("Definition of Style");
layer.userStyles().add(style);
sld.layers().add(layer);
SLDTransformer styleTransform = new SLDTransformer();
String xml = styleTransform.transform(sld);
堆栈跟踪:
net.sf.saxon.trans.XPathException: The SAX2 parser org.geotools.xml.transform.TransformerBase$XMLReaderSupport does not support setting the 'namespaces' feature to true
net.sf.saxon.event.Sender.configureParser(Sender.java:562)
net.sf.saxon.event.Sender.sendSAXSource(Sender.java:313)
net.sf.saxon.event.Sender.send(Sender.java:152)
net.sf.saxon.IdentityTransformer.transform(IdentityTransformer.java:39)
org.geotools.xml.transform.TransformerBase$Task.run(TransformerBase.java:300)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:133)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:121)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:162)
org.auscope.portal.server.web.controllers.SLDController.getOilAndGasStyle(SLDController.java:53)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:177)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:82)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
我猜这是一个可以使用 Maven 解决的问题,但我有点迷茫。如何确保我的项目为 GeoTools 使用正确的 XSLT 处理器,同时不破坏门户核心依赖项的配置?
好吧,堆栈跟踪中的消息告诉您到底出了什么问题:
SAX2 解析器 org.geotools.xml.transform.TransformerBase$XMLReaderSupport 不支持将 'namespaces' 功能设置为 true
Saxon 默认使用 JAXP 工厂机制获取 SAX2 解析器,它找到的解析器属于 geotools 项目。
SAX2 规范说:"All XMLReaders are required to support setting http://xml.org/sax/features/namespaces to true"但是这个特定的 XMLReader 似乎不允许这个设置,结果是 Saxon 无法使用这个解析器。
可能有各种各样的变通办法,但设计一个变通办法需要一些地理工具方面的知识,而我当然不具备这些知识。例如,我不知道手头的任务是否真的需要这个解析器,或者是否需要一个不同的解析器。
堆栈跟踪还显示 geotools 正在尝试进行恒等式转换,并为此目的使用了 Saxon。它可能通过使用 JAXP 工厂机制来加载类路径上的任何转换器。这是一个糟糕的策略:如果您打算使用 JAXP 机制来加载您的身份转换器,那么您应该首先测试您的代码以检查它是否适用于最常见的代码。通过设置相关的 JAXP 系统可以说服 geotools 使用不同的身份转换器 属性。
我正在尝试使用 GeoTools 使一个项目工作,该项目具有使用 Saxonica 的依赖项。到目前为止,没有运气
项目 pom.xml
依赖项:
<dependencies>
<dependency>
<groupId>org.auscope.portal</groupId>
<artifactId>portal-core</artifactId>
<version>${portal.core.version}</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>14.2</version>
</dependency>
</dependencies>
portal-core
pom.xml
相关依赖项:
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-xom</artifactId>
<version>8.7</version>
</dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-xpath</artifactId>
<version>8.7</version>
<optional>false</optional>
</dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>saxon-dom</artifactId>
<version>8.7</version>
<optional>false</optional>
</dependency>
SLDController.java
代码:
StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);
StyledLayerDescriptor sld = styleFactory.createStyledLayerDescriptor();
sld.setName("example");
sld.setAbstract("Example Style Layer Descriptor");
UserLayer layer = styleFactory.createUserLayer();
layer.setName("layer");
FeatureTypeConstraint constraint = styleFactory.createFeatureTypeConstraint("Feature", Filter.INCLUDE, null);
layer.layerFeatureConstraints().add(constraint);
Style style = styleFactory.createStyle();
style.getDescription().setTitle("Style");
style.getDescription().setAbstract("Definition of Style");
layer.userStyles().add(style);
sld.layers().add(layer);
SLDTransformer styleTransform = new SLDTransformer();
String xml = styleTransform.transform(sld);
堆栈跟踪:
net.sf.saxon.trans.XPathException: The SAX2 parser org.geotools.xml.transform.TransformerBase$XMLReaderSupport does not support setting the 'namespaces' feature to true
net.sf.saxon.event.Sender.configureParser(Sender.java:562)
net.sf.saxon.event.Sender.sendSAXSource(Sender.java:313)
net.sf.saxon.event.Sender.send(Sender.java:152)
net.sf.saxon.IdentityTransformer.transform(IdentityTransformer.java:39)
org.geotools.xml.transform.TransformerBase$Task.run(TransformerBase.java:300)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:133)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:121)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:162)
org.auscope.portal.server.web.controllers.SLDController.getOilAndGasStyle(SLDController.java:53)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:177)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:82)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
我猜这是一个可以使用 Maven 解决的问题,但我有点迷茫。如何确保我的项目为 GeoTools 使用正确的 XSLT 处理器,同时不破坏门户核心依赖项的配置?
好吧,堆栈跟踪中的消息告诉您到底出了什么问题:
SAX2 解析器 org.geotools.xml.transform.TransformerBase$XMLReaderSupport 不支持将 'namespaces' 功能设置为 true
Saxon 默认使用 JAXP 工厂机制获取 SAX2 解析器,它找到的解析器属于 geotools 项目。
SAX2 规范说:"All XMLReaders are required to support setting http://xml.org/sax/features/namespaces to true"但是这个特定的 XMLReader 似乎不允许这个设置,结果是 Saxon 无法使用这个解析器。
可能有各种各样的变通办法,但设计一个变通办法需要一些地理工具方面的知识,而我当然不具备这些知识。例如,我不知道手头的任务是否真的需要这个解析器,或者是否需要一个不同的解析器。
堆栈跟踪还显示 geotools 正在尝试进行恒等式转换,并为此目的使用了 Saxon。它可能通过使用 JAXP 工厂机制来加载类路径上的任何转换器。这是一个糟糕的策略:如果您打算使用 JAXP 机制来加载您的身份转换器,那么您应该首先测试您的代码以检查它是否适用于最常见的代码。通过设置相关的 JAXP 系统可以说服 geotools 使用不同的身份转换器 属性。